Кластерные EJB не сбалансированы в JBoss AS 7
Я успешно настроил кластер из 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);
}
}
Из файлов журнала видно, что компонент правильно развернут в кластере. На стороне клиента я затем создаю несколько потоков, которые ищут и вызывают экземпляр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();
Что я делаю не так?
ОБНОВИТЬ
Если я указываю только второй узел в списке соединений, я получаю:
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 окажутся только в этом узле. Однако для меня этого решения достаточно.