EJB 中的计划计时器良好实践模式和 EE 应用程序的纯 CDI



>我有由war组成的耳朵应用程序 - 一个servlet和ejb。

我需要 ejb 仅用于 @javax.ejb.Schedule。它应该每分钟运行一次,它所做的只是触发一个将被战争应用程序拦截的 CDI 事件。

事实证明这是行不通的,因为显然,CDI 事件仅在类共享同一个类加载器时才连接。EJB 和 WAR 是不同的包 - 不同的类加载器。

所以我想出了这个模式(以最基本的形式(:

@javax.enterprise.context.ApplicationScoped
public class TimerMockUp {
@Resource(mappedName="java:jboss/ee/concurrency/executor/cacheService") Executor ex;
@Inject Event<SomeEvent> evt;
@PostConstruct
private void initTimer(){
ex.execute(()->{
try{
while(true){
evt.fire(new SomeEvent());
Thread.sleep(4000);
}
} catch (Exception ex){
}
});
}

您对此有何看法?你认为从长远来看这可靠吗?还有哪些其他选择可以实现同样的事情?

不确定注入事件的要求是什么,但运行增量计时器的标准方法是使用带有@Schedule注释的 EJB 计时器。

例如:

@Singleton
@Startup
public class TimerBean {
@Schedule(hour = "*", minute = "*", second = "*/5", persistent = false)
public void doEvery5Sec() { 
// do something...
}
}

最新更新