背景
我有一个带有两个节点的集群 JBoss 环境。我已经成功实现了两个一次只在一个节点上运行的集群计划任务。如果当前拥有计划任务的节点关闭,则所有权将转移到其他节点。我在这里使用了官方示例来实现它,它就像一个魅力。
我想做的事
请注意,以下不是关于时间表的。这是关于现在需要在集群上保持状态的单例。以上只是对我尝试过的内容的描述。
现在我有一个连接池,它也需要分布在节点上。此池包含一个同步列表,其中包含与外部系统的连接的抽象。客户端“借用”一个连接,做一些工作,然后返回它。这种情况经常发生,每小时最多 6000 次。它被定义为@Singleton
EJB,简化后看起来像这样:
@Singleton
@Startup
public class ConnectionPoolBean {
private SomeObjectWithSynchronizedPool pool;
public void borrowConnection() {
pool.getConnectionFromSynchronizedList();
}
public void returnConnection() {
pool.returnConnectionFromSynchronizedList();
}
}
如果可能的话,我想访问下面的类(这是我可以修改的遗留代码)。connectionPool
然后将引用同一个对象,而不管哪个节点正在执行代码。
@Stateless
public class SomeBeanUsingPool implements SomeBeanUsingPoolInterface {
@EJB
private ConnectionPoolBean connectionPool;
public void doSomething() {
connectionPool.borrowConnection();
// do stuff...
connectionPool.returnConnection();
}
}
我试过的
我重用了背景中描述的实现,实现了一个 HA Singleton Service。然而,这意味着该类一次只能在一个节点上使用(即对于节点 2,它不会在容器中启动,直到节点 1 关闭)。这让我意识到集群的 HA Singleton 不是这里的方法,它只确保 bean 一次只能在一个节点上可用。
问题
如何实现我的目标,为整个集群拥有一个共享池?我真正需要分享的是ConnectionPoolBean.pool
对象,因为同步发生在那里。ConnectionPoolBean
尽管在集群中共享整个内容会很好。此外,如果一个节点出现故障,我需要保持状态,我认为 HA 单例不适合。