我有一个运行在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