Вызов удаленного ejb в кластере wildfly с двумя узлами

Я пытаюсь вызвать удаленный ejb на каждом узле кластера с узлами node1 и node2, но я всегда получаю node1. Развернул EJB и клиентский код в виде файла EAR на обоих узлах. Приложение работает на сервере приложений Wildfly 9. Вызванный клиентский код из node1.

Код EJB:

@Remote
public interface SLSBRemote {
    public void test();
}

@Stateless(mappedName="SLSBEJB")
public class SLSBEJB implements SLSBRemote {
    @Override
    public void test() 
    {
       try {
          String nodeName = System.getProperty("jboss.node.name");
          if(nodeName == null) {
             nodeName = InetAddress.getLocalHost().getHostName();
          }
          log.debug("nodename: "+nodeName);
       } catch (Exception e) {
          log.error("Error",e);
       }
    }
}

код клиента:

public class testEjb
{
    //invoking this method from other class. Able to pass node address
    public void testBean(List<String> nodes)
    {
       Properties properties = new Properties();
       properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
       Context context;
       for (String node : nodes) {
           properties.put(Context.PROVIDER_URL,"http-remoting://" + node);
           try {
             context = new InitialContext(properties);                  
             SLSBRemote slsbRemote=(SLSBRemote)context.lookup(getLookupName());
             log.debug("node:"+node+"slsbejbobject:"+slsbRemote.hashCode());
             slsbRemote.test();
           } catch (NamingException e) {
             log.error("Error ", e);
           }
       }
   }
}

В журналах

node: "node1", binddbejb object: 1276422461
node: "node2", binddbejb object: 1276422461
nodename: "node1_address"
nodename: "node1_address" (instead of node2_address)

Пожалуйста, предложите


person Sumanth    schedule 28.01.2016    source источник
comment
Вероятно, в вашем кластере есть только одна служба JNDI.   -  person Gabriel Aramburu    schedule 28.01.2016
comment
Габриэль, я не понял. Как я могу убедиться, что у каждого узла в кластере есть отдельная служба JNDI?   -  person Sumanth    schedule 29.01.2016
comment
Вы можете проверить свои узлы списка и убедиться, что они различны во время создания перед выполнением testBean(list‹?›).   -  person    schedule 02.02.2016
comment
Какая часть журнала от клиентов и узлов? Код говорит: log.debug(node:+node+slsbejbobject:+slsbRemote.hashCode()); часть журнала вашего сообщения говорит: node: node1, объект binddbejb: 1276422461 Кажется, это разные версии.   -  person Spyros K    schedule 02.02.2016


Ответы (1)


Чтобы использовать кластеризованный EJB wild fly, необходимо настроить его для кластеризации, и, насколько я обнаружил:

  1. Wildfly обеспечивает кластеризацию EJB с отслеживанием состояния.
  2. Документация Wild fly содержит пример сценария отработки отказа для кластеризации. (Клиент пытается связаться с ejb на сервере №1, если он недоступен, клиент связывается с ejb на сервере №2.)
  3. Кластерные Ejbs должны быть настроены по мере необходимости и должным образом аннотированы.
import org.jboss.ejb3.annotation.Clustered;
import javax.ejb.Stateful;

@Stateful
@Clustered
public class MyStatefulBean {
...
}

Примеры даны с этой страницы документации, где подробно описано, что нужно сделать. https://docs.jboss.org/author/display/WFLY8/EJB+Services

Если вы примените эту конфигурацию, компоненты EJB со всех узлов кластера смогут обслуживать клиента.

Однако обратите внимание, что клиент обычно не должен знать о кластеризации. Клиенты должны вызывать ejb, и кластер должен решать, какой экземпляр обслуживает клиента.

person Spyros K    schedule 02.02.2016
comment
Это может сбить людей с толку: кластеризация EJB предоставляется только для EJB с состоянием. Кластер работает в Wildfly для EJB без состояния, обеспечивая отработку отказа и балансировку нагрузки. - person Dherik; 21.02.2017
comment
Я обновил текст. Вы правы, я улучшил формулировку благодаря вашему наблюдению. - person Spyros K; 01.03.2017