2011-01-07 45 views
3

我正在部署在JBoss 6 Final上的大型Java EE 6應用程序。我目前的任務涉及一致地使用@Inject而不是@EJB,但我遇到了一些類型的bean的問題,特別是@MessageDriven bean和具有@Scheduled方法的bean。CDI注入如何在MDB和@Scheduled bean中工作?

會發生什麼情況是,如果我不喜歡時間(對於@Schedule)或者在啓動時MDB隊列中有消息,那麼bean的實例化將失敗,因爲注入的資源(它們本身就是EJB)尚未約束。

因爲我使用@Inject,我猜EJB容器認爲我的bean準備就緒,因爲容器本身不關心@Inject;它可能只是假設由於沒有@EJB注入,這些bean已準備好使用。注入的CDI代理將會失敗,因爲注入的資源實際上還沒有綁定。

微小例如:

@Stateless 
@LocalBean 
public class MySupportingBean { 

    public void doSomething() { 
     ... 
    } 
} 

@Singleton 
public class MyScheduledBean { 

    @Inject 
    private MySupportingBean supportingBean; 

    @Schedule(second = "*/1", hour = "*", minute = "*", persistent = false) 
    public void onTimeout() { 
     supportingBean.doSomething(); 
    } 
} 

上面的例子可能不會經常因爲只有兩個豆失敗了,但我工作的項目結合大量的EJB,這將放大的問題。但是它可能會失敗,因爲不能保證MySupportingBean首先被綁定,並且如果在MySupportingBean被綁定之前調用了onTimeout,那麼MyScheduledBean的實例化將失敗。如果我使用@EJB,MyScheduledBean將不會被綁定,直到對MySupportingBean的依賴得到滿足。

請注意,該示例在onTimeout本身不會失敗,但是當CDI嘗試注入MySupportingBean時。

我讀過很多帖子,在很多人認爲@Inject總是比較好的論壇上。一般來說,我同意,但他們如何處理與@Inject結合的@Schedule或@MessageDriven?根據我的經驗,在這些情況下,無論bean是否工作,這都歸結爲愚蠢的運氣,並且bean將隨意失敗,具體取決於EJB的部署順序以及何時調用@Schedule或onMessage。

回答

0

它可能有助於使用JBoss專有註釋@Depends或使用jboss.xml文件顯式定義依賴關係。

一個有點類似的問題,請參見本:How to order deployment of EJBs and JMS queue config in JBoss 5?

+0

我已經考慮過這種可能性,但作爲應用服務器是無關的是樣很重要;出於政治原因,我們很可能會在不久的將來轉向其他應用服務器。此外,我們是否真的必須依靠專有註釋來使通用框架按預期工作? – 2011-01-10 07:26:05