我对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批处理。但是我认为这两个概念都用于有限过程?
在当前项目中使用EJB TimerService执行定期数据修剪或后端数据同步等任务。它不仅允许单次执行,还允许使用基于日历的计划的间隔计时器和计时器。
Smth喜欢:
@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
}
}