我剛閱讀Java EE 6 @javax.annotation.ManagedBean vs. @javax.inject.Named vs. @javax.faces.ManagedBean各種管理豆類和他們的關係非常好的解釋,正如我在我的應用程序面臨一個惱人的問題,我想知道,如果有可能控制或影響豆的開始方式和時間。的Java EE 6:管理豆的控制啓動與依賴關係:CDI,EJB
在我的Java EE應用程序,我使用EJB,CDI和JSF2作爲視圖技術。通過SPI,來自第三方的服務被引導,並且它配置作業執行器,該作業執行器啓動作業並處理其他與計時器相關的事情。當工作執行者完成自舉時,立即執行一項工作。這項工作使用CDI注入來訪問一些bean,其中一個bean使用EJB。
的問題是,現在大部分時間在Java EE 6服務器(JBoss的7.1.1)開始EJB仍然不可用,則該程序試圖訪問它。引發異常並且作業失敗,並且構建服務以停用失敗的作業。那麼,取消一個faild工作似乎不是太糟糕。該工作再次啓動和運行的唯一解決方案是取消部署並重新部署。不幸的是,這是一項手動任務,不能通過編程來完成。
而且,爲了使事情不好:在極少數情況下,這不會發生。
所以,我現在的問題是:我可以以某種方式控制EJB和CDI bean的初始化和部署,以便我可以確保在CDI bean初始化之前初始化所有EJB bean?
我在EARs application.xml中將initialize-in-order設置爲true,並設置了EJB的順序,以便它們以我需要的方式初始化(EJB核心,然後是EJB業務,然後是WAR),但基於CDI的服務作爲JAR放置在lib文件夾中。從Java EE 6 Tutorial
你嘗試使用'CDI的Events'功能後,使CDI服務啓動? – Tair
例如在EJB'@ PostConstruct'中觸發一個由您的服務觀察到的事件。 – Tair
@tair no。我沒有意識到我可以爲自己開發CDI事件:)你是說我可以從服務所依賴的所有EJB中激發事件,然後採取行動?例如阻止或釋放工作? – Joysn