JBoss 7集群中的共享同步池

时间:2013-08-09 11:23:38

标签: java jboss ejb jboss7.x cluster-computing

背景

我有一个带有两个节点的集群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不适合。

0 个答案:

没有答案