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