1

背景

我有一个带有两个节点的集群 JBoss 环境。我已经成功实现了两个一次只在一个节点上运行的集群计划任务。如果当前拥有计划任务的节点关闭,则所有权将转移到其他节点。我在这里使用了官方示例来实现它,它就像一个魅力。

我想做的事

请注意,以下不是关于时间表的。这是关于现在需要在集群上保持状态的单例。以上只是对我尝试过的内容的描述。

现在我有一个连接池,它也需要分布在节点上。此池包含一个同步列表,其中包含与外部系统的连接的抽象。客户端“借用”一个连接,做一些工作,然后返回它。这种情况经常发生,每小时最多 6000 次。它被定义为@SingletonEJB,简化后看起来像这样:

@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 单例不适合。

4

0 回答 0