我有一個包含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