2 つの JBoss AS 7 インスタンスのクラスターを正常にセットアップし、次の SLSB をデプロイしました。
@Stateless
@Remote(TestEJBRemote.class)
@Clustered
public class TestEJB implements TestEJBRemote {
private static final long serialVersionUID = 1L;
private static final Logger logger = Logger.getLogger(...);
@Override
public void test() {
String nodeName = System.getProperty("jboss.node.name");
logger.info(nodeName);
}
}
ログ ファイルから、Bean がクラスターに正しくデプロイされていることがわかります。次に、クライアント側で、 のインスタンスをルックアップして呼び出す多数のスレッドを作成しますTestEJB
。ただし、すべてのインスタンスが同じノードに配置されるようです。
「jndi.properties」ファイルは次のとおりです。
java.naming.factory.url.pkgs=org.jboss.ejb.client.naming
そして「jboss-ejb-client.properties」:
endpoint.name=client-endpoint
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=default
remote.connection.default.host=192.168.0.1
remote.connection.default.port=4447
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
remote.connection.default.username=user
remote.connection.default.password=pass
remote.clusters=ejb
remote.cluster.ejb.clusternode.selector=org.jboss.ejb.client.RandomClusterNodeSelector
私が行うクライアントではfinal InitialContext ctx = new InitialContext();
、各スレッド内で次のように形成します。
String name = "ejb:/test//TestEJB!" + TestEJBRemote.class.getName();
TestEJBRemote remote = (TestEJBRemote) ctx.lookup(name);
remote.test();
私が間違っているのは何ですか?
アップデート
接続リストで 2 番目のノードのみを指定すると、次のようになります。
java.lang.IllegalStateException: No EJB receiver available for handling [...] combination for invocation context org.jboss.ejb.client.EJBClientInvoc
ationContext
したがって、おそらくこの問題を最初に解決する必要があります...
更新 2
スレーブノードにアプリケーションユーザーを設定することで、最終的に問題を解決しました。以前は、管理ユーザーとして接続しようとしていましたが、うまくいきませんでした。
接続リスト (「jboss-ejb-client.properties」内) でスレーブ ノードを指定する限り、負荷分散も機能するようになりました。マスター ノードを指定すると、すべての EJB は最終的にそのノードにのみ配置されます。ただし、このソリューションで十分です。