2017-07-29 40 views
0

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

     } 
    }); 
} 

什麼是您對此有何看法?你認爲這在長期內會是可靠的嗎?還有什麼其他的選擇來實現同樣的目標?

+0

只是因爲我有興趣爲純EJB-3.X人。我想這是一個ejb-3.x應用程序。爲什麼你需要部署一個耳朵,不能把所有東西都放入戰爭? – aschoerk

+0

最初的意圖是隻有WAR,但是對於Timer的需求則來自...... EJB領域。但隨後發生了與CDI事件的混戰。 – hrs

+1

你知道嗎,你可以把你的EJB放到WAR中,或者你在使用2.x版本嗎?請參閱:https://docs.oracle.com/cd/E19798-01/821-1841/gippi/index.html – aschoerk

回答

0

不確定您的注入事件的要求是什麼,但運行增量計時器的標準方法是使用帶有@Schedule註釋的EJB計時器。

例如:

@Singleton 
@Startup 
public class TimerBean { 

    @Schedule(hour = "*", minute = "*", second = "*/5", persistent = false) 
    public void doEvery5Sec() { 
     // do something... 
    } 
} 
+0

是的,那是真的。但是這個EJB無法將CDI事件發送給另一個模塊中的Observer,這正是我所需要的。 – hrs