我想使用Java EE 7中的ManagedScheduledExecutorService API在JSF Java EE Web应用程序中动态执行后台任务。
此刻,我正处于将后台任务放入ManagedScheduledExecutorService的关键时刻。
我已经尝试了3种不同的解决方案,它们全部在战时部署时执行,而不是在JBoss完成启动时执行。问题是,在Web应用程序部署期间ManagedScheduledExecutorService可能不可用,我只收到NullPointerException。
您有想法,如何在jboss完成启动之后而不是在应用程序部署之后安排我的后台任务。
这是我尝试过的3个解决方案-所有解决方案都在JBoss启动完成之前执行。
第一个解决方案:
用@Singleton和@Startup注释的类 和2种使用@PostConstruct或@PreDestroy
的方法第二个解决方案:
实现ServletContextListener并用@WebListener注释的类 接口中的2种方法contextDestroyed和contextInitialized
第三种解决方案:
具有2种方法的类public void init(@Observes @Initialized(ApplicationScoped.class)对象o)和public void destroy(@Observes @Destroyed(ApplicationScoped.class)Object o)
代码,用于初始化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);
}