ExecutorService在JBoss启动期间抛出NullPointerException

时间:2019-06-13 13:14:30

标签: java jboss executorservice

我想使用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);
}

0 个答案:

没有答案