我有一個運行在GlassFish
上的Java EE 6 Web應用程序。該應用程序使用2個本地Singleton EJB
MySingleton實例。 MySingleton的每個實例都通過API連接到第三方軟件。GlassFish在不同物理服務器上運行EJB
MySingleton.java
@Singleton
@LocalBean
public class MySingleton {
@PersistenceContext private EntityManager em;
private ThirdPartyAPI thirdPartyAPI;
...
}
MySingletonManager.java
@Singleton
@LocalBean
public class MySingletonManager {
@EJB private MySingleton mySingletonA;
@EJB private MySingleton mySingletonB; ///Aargh! They can't run on the same server!!
...
}
這裏有約束:
- 第三方軟件供應商要求其軟件運行的每個插件在不同的物理服務器上使用
ThirdPartyAPI
- MySingleton使用注入的實例
EntityManager
,在同一PersistenceContext
上查詢和事務所需的實例。
爲了滿足約束條件1,我認爲我需要遠程訪問辛格爾頓EJB:我需要告訴應用服務器像「在服務器A上運行mySingletonA,mySingletonB服務器B」。爲此,我看到有可能通過JNDI
來調用遠程EJB。
爲了滿足約束2,我認爲我需要使用GlassFish clustering
,因爲PersitenceContext需要在MySingleton的兩個實例間共享。
不幸的是,我無法找到任何有關如何將2個tecnhologies結合使用的參考(遠程EJB和集羣)。
我正在尋找有關此方案的首選體系結構的提示或建議,並最終提供了一些實施準則。
感謝您的回答。鑑於這個話題的複雜性,我需要一些時間......順便說一下:你能否澄清(最終有一些參考文獻)「單身人士不能擁有一個國家」? – perissf 2012-02-28 14:02:50
剛剛發現這篇關於Singletons的有趣文章http://java.sun.com/developer/technicalArticles/Programming/singletons/。感謝提示 – perissf 2012-02-28 14:23:09
集羣J2EE環境中的單例實際上在集羣中的每個節點上都有一個單例實例。否則,就會出現單點故障......因此,在羣集環境中,將狀態置於單例時必須採取額外的預防措施,因爲它們不是「真正的」Singleton。管理這個最簡單的方法是避免將狀態放入羣集單例中。 – 2012-02-28 15:57:54