Я хочу использовать API ManagedScheduledExecutorService из Java EE 7 для динамического выполнения фоновых задач в моем веб-приложении JSF Java EE.
В данный момент я застрял в точке, когда помещать фонзадачи в ManagedScheduledExecutorService.
Я уже попробовал 3 различных решения, все они выполняются во время развертывания войны, а не во время запуска JBoss.Проблема в том, что ManagedScheduledExecutorService, вероятно, недоступен во время развертывания веб-приложения, и я получаю только исключение NullPointerException.
У вас есть идея, как планировать фоновую задачу после завершения запуска jboss, а не после развертывания приложения.
Вот мои 3 решения, которые я пробовал - все заканчивалось выполнением до завершения запуска JBoss.
Первое решение:
Класс, аннотированный @Singleton и@Startup и 2 метода с помощью @PostConstruct или @ PreDestroy
Второе решение:
Класс, реализующий ServletContextListener и аннотированный с помощью @WebListener и 2 методов contextDestroyed и contextInitialized из интерфейса
Третье решение:
Класс с 2 методами public void init (@Observed @Initialized (ApplicationScoped.class) Object o) и public void destroy (@Observed @Destroyed (ApplicationScoped.class) Объект o)
Код, тыс. Грнat используется для инициализации фоновых задач в ExecutorService:
@Resource
private ManagedScheduledExecutorService executorService;
private List<ScheduledFuture<?>> scheduledTasks;
public void init(@Observes @Initialized(ApplicationScoped.class) Object o) {
this.scheduledTasks = Collections.synchronizedList(new ArrayList<ScheduledFuture<?>>());
ScheduledFuture<Boolean> task = executorService.schedule(() -> {
try {
//Do work
return true;
} catch (Exception e) {
//Log error
return false;
}
}, new Trigger() {
@Override
public Date getNextRunTime(LastExecution le, Date date) {
return getNextDate(10);
}
@Override
public boolean skipRun(LastExecution le, Date date) {
return false;
}
});
scheduledTasks.add(task);
}