У меня есть неклиентское приложение, которое я хочу запустить. У него не будет клиентов, но он будет совершать HTTP-вызовы и действовать как клиент для других служб. Он будет работать, возможно, несколько часов или дней (но это не потребует периодических запусков — только один раз).
Я хочу запустить его в контейнере Java EE 7 из-за преимуществ стандартного внедрения зависимостей контекста (CD) и стандартного клиента JAX-RS (нового со времен Java EE 7). Также приятно иметь такие сервисы, как JMS, JPA.
Вопрос в том, как мне написать/аннотировать основной метод стандартным образом? @Inject
в методе не годится, потому что такие методы должны возвращаться быстро. @Schedule
не идеален, потому что он запускается периодически, если я программно не определяю текущее системное время.
Лучшее, что я мог придумать, это установить одноразовый Timer
в методе @Inject
и аннотировать мой основной метод с помощью @Timeout
.
Почему-то это кажется немного хрупким или неэлегантным. Есть ли лучший стандартный способ запуска службы? Какая-то аннотация, которая просто заставит ее запуститься и начать работать?
Кроме того, как каков наилучший стандартный способ прерывания и закрытия службы при отмене развертывания?
@Schedule
. . - person Perception   schedule 11.05.2013@Schedule
требует времени. В какое время я должен аннотировать метод? Я не хочу, чтобы он запускался периодически. Метод нужно запустить ровно один раз. Если@Schedule
принимает интервал после развертывания, это было бы идеально, но это не так. Могу ли я использовать@Schedule ... myfunc (Timer timer)
и отменить входящий таймер и использоватьTimerService
установить интервальный таймер для запуска@Timeout ... mymain ()
задействованных звуков. - person necromancer   schedule 11.05.2013@PostConstruct
. - person necromancer   schedule 11.05.2013@PreDestroy
установил флаг и ждал блокировки, удерживаемой основным методом, который освобождается, когда основной замечает флаг и завершает работу? По сути, я хочу остановиться на undeploy и начать развертывание без каких-либо других ручных или нестандартных методов. - person necromancer   schedule 11.05.2013@Asynchronous
из@PostConstruct
вашего SLSB. Вам нужно будет спроектировать свою задачу так, чтобы ее можно было прервать, и вызвать указанное прерывание из обратного вызова@PreDestroy
. - person Perception   schedule 11.05.2013@Asynchronous
! но я не знаю, как вызвать его асинхронно из@PostConstruct
- без прокси работает синхронный вызов. мой основной метод и постконструкция находятся в одном классе@Singleton
. нужен самопрокси в postconstruct. - person necromancer   schedule 11.05.2013@Asynchronous
помогло, но у меня другая проблема. Я могу обойти это, но я хотел бы сообщить об этом Glassfish как об ошибке, если это действительно так: stackoverflow.com/questions/16493381/ - person necromancer   schedule 11.05.2013@Asynchronous
см. Мой комментарий к ответу @JanGalinsky ниже. Спасибо! - person necromancer   schedule 12.05.2013