バックグラウンド
2 つのノードを持つクラスター化された JBoss 環境があります。一度に 1 つのノードでのみ実行される 2 つのクラスター化されたスケジュールされたタスクを正常に実装しました。スケジュールされたタスクを現在所有しているノードがシャットダウンされると、所有権は他のノードに移されます。ここで公式の例を使用してそれを達成しましたが、それは魅力のように機能します。
やりたいこと
以下はスケジュールに関するものではないことに注意してください。これは、クラスター全体で状態を維持する必要があるシングルトンに関するものです。上記は、私が試したことの単なる説明です。
これで、ノードにも分散する必要がある接続プールができました。このプールには、外部システムへの接続の抽象化を含む同期リストが含まれています。クライアントは接続を「借用」し、なんらかの仕事をして、それを返します。これは非常に頻繁に発生し、最大で 1 時間あたり 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 シングルトン サービスを実装しました。ただし、これはクラスが一度に 1 つのノードでしか利用できないことを意味していました (つまり、ノード 2 の場合、ノード 1 がダウンするまでコンテナーで開始されません)。これにより、クラスター化された HA シングルトンはここに行く方法ではないことに気付きました。Bean が一度に 1 つのノードでのみ使用可能であることを確認するだけです。
質問
クラスター全体の共有プールを持つという目標を達成するにはどうすればよいですか? 私が本当に共有する必要があるのはConnectionPoolBean.pool
オブジェクトです。同期が行われるのはオブジェクトです。ConnectionPoolBean
クラスター全体で全体を共有するのはいいことですが。また、1 つのノードがダウンした場合でも状態を維持する必要がありますが、これには HA シングルトンは適していないと思います。