背景
我有一个带有两个节点的集群JBoss环境。我已经成功实现了两个只能一次在一个节点上运行的集群计划任务。如果关闭当前拥有计划任务的节点,则将所有权转移到另一个节点。我使用官方示例here来实现它,它就像一个魅力。
我想做什么
请注意,以下内容与时间表无关。现在需要在群集上保持状态。以上只是对我所尝试过的描述。
现在我有一个需要在节点上分发的连接池。此池包含一个同步列表,其中包含与外部系统的连接的抽象。客户端“借用”连接,完成某项工作并返回它。这种情况经常发生,每小时最多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服务。但是,这意味着该类一次只能在一个节点上使用(即对于节点2,它不会在容器中启动,直到节点1关闭)。这让我意识到群集的HA Singleton不是这里的方法,它只能确保bean一次只能在一个节点上使用。
问题
如何实现目标,拥有整个群集的共享池?我真正需要分享的是ConnectionPoolBean.pool
对象,因为同步发生在那里。虽然在群集中共享整个ConnectionPoolBean
会很不错。另外,如果一个节点发生故障,我需要保持状态,我认为HA Singleton不适合。