我有一个包含war的应用程序 - 一个servlet和ejb。在EJB中的预定计时器良好实践模式和EE应用程序的纯CDI
我只需要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){
}
});
}
什么是您对此有何看法?你认为这在长期内会是可靠的吗?还有什么其他的选择来实现同样的目标?
只是因为我有兴趣为纯EJB-3.X人。我想这是一个ejb-3.x应用程序。为什么你需要部署一个耳朵,不能把所有东西都放入战争? – aschoerk
最初的意图是只有WAR,但是对于Timer的需求则来自...... EJB领域。但随后发生了与CDI事件的混战。 – hrs
你知道吗,你可以把你的EJB放到WAR中,或者你在使用2.x版本吗?请参阅:https://docs.oracle.com/cd/E19798-01/821-1841/gippi/index.html – aschoerk