我对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批处理。但是我认为这两个概念都用于有限过程?
答案 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。