如何使用EJB实现永久的后台进程?

时间:2019-04-11 19:45:11

标签: java java-ee ejb

我对EJB中的一般设计模式有疑问。我有Java EE应用程序(EJB和Web),并且需要一种后台进程,该进程通过JPA永久扫描和处理特定数据。

我考虑的一种解决方案是实现@Singleton EJB。在用@PostConstruct注释的方法中,我可以开始我的过程。

@Singleton
@Startup
public class MyUpdateService {
    @PostConstruct
    void init() {
        while(true) {
            // scann for new data...
            // do the job.....
        }
    }
}

但这是推荐模式吗?还是有更好的方法在EJB容器中运行此类?

在EJB中,还有其他模式,例如@TimerService和新的Java EE7批处理。但是我认为这两个概念都用于有限过程?

2 个答案:

答案 0 :(得分:2)

在当前项目中使用EJB TimerService进行诸如定期数据修剪或后端数据同步之类的任务。它不仅允许单次执行,还允许间隔计时器和具有基于日历计划的计时器。

类似:

@Startup
@Singleton
public class SyncTimer {
    private static final long HOUR = 60 * 60 * 1000L;

    @Resource
    private TimerService timerService;
    private Timer timer;

    @PostConstruct
    public void init() {
        TimerConfig config = new TimerConfig();
        config.setPersistent(false);
        timer = timerService.createIntervalTimer(HOUR, HOUR, config);
    }

    @Timeout
    private synchronized void onTimer() {
        // every hour action
    }
}

答案 1 :(得分:0)

作为自Java EE 7起@devmind提到的TimerSerivce的替代方法,可以使用ManagedScheduledExecutorService:

booksID

与TimerSerivce不同,ExecutorService可以在单独的任务中并行运行。另请参见blog post form Adam Bien