Поиск EJB WildFly 8 завершился неудачно из-за отсутствия доступного контекста кластера

Вот пример того, что мне нужно сделать. Существует удаленный интерфейс EJB с фиктивным методом. Интерфейс реализуется двумя EJB с отслеживанием состояния, и первый должен выполнять поиск второго:

@Stateful
@Remote(BeanI.class)
public class Bean1 implements BeanI {
  @Override
  public void doSomething() {
    try {
      System.out.println("Bean1");
      JndiManager.lookup(Bean2.class).doSomething();
    } catch (Exception ex) { ... }
  }
}

@Stateful
@Remote(BeanI.class)
public class Bean2 implements BeanI {
  @Override
  public void doSomething() {
    System.out.println("Bean2");
  }
}

Вспомогательный класс JndiManager выглядит следующим образом:

public class JndiManager {
  private static Hashtable<String, Object> jndiProps;
  static {
    jndiProps = new Hashtable<>();
    jndiProps.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
  }

  public static BeanI lookup(Class<?> cls) throws NamingException {
    final String name = "ejb:/TestServer//" + cls.getSimpleName() + "!" + 
      BeanI.class.getName() + "?stateful";
    Context ctx = new InitialContext(jndiProps);
    return (BeanI) ctx.lookup(name);
  }
}

Клиентское приложение выполняет поиск Bean1 и вызывает его метод. Вот файл jboss-ejb-client.properties:

remote.clusters=ejb
remote.cluster.ejb.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
remote.cluster.ejb.connect.options.org.xnio.Options.SSL_ENABLED=false
remote.cluster.ejb.username=someuser
remote.cluster.ejb.password=somepass1~

endpoint.name=client-endpoint
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=default
remote.connection.default.host=localhost
remote.connection.default.port=8080
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
remote.connection.default.username=someuser
remote.connection.default.password=somepass1~

Bean1 вызывается успешно, но поиск Bean2 не выполняется. Ошибка:

java.lang.IllegalStateException: EJBCLIENT000029: No cluster context available for cluster named ejb
line -> JndiManager.lookup(Bean2.class).doSomething();

Он отлично работает в автономном режиме, но не работает в режиме домена (при работе с одним главным узлом). Также все отлично работает в JBoss EAP 6.1.

Любая помощь будет оценена.


person gcvt    schedule 10.04.2014    source источник


Ответы (1)


Похоже, это ошибка WildFly.

WildFly ожидает, что локальный клиент EJB будет инициализирован для кластеризации, см. org.jboss.ejb.client.EJBClientContext, строка 989 ​​

Но инициализация не происходит из-за отсутствия зависимости от службы EJBRemoteConnectorService, см. org.jboss.as.ejb3.remote.LocalEjbReceiver, строка 449.

Зависимость от EJBRemoteConnectorService определяется как необязательная в org.jboss.as.ejb3.subsystem.EJB3SubsystemAdd, строки 416 и 426. Проблема в том, что EJBRemoteConnectorService всегда инициализируется после службы LocalEjbReceiver и поэтому всегда имеет значение NULL в LocalEjbReceiver. Это приводит к пропуску инициализации кластера.

Эту проблему можно исправить, изменив DependencyType.OPTIONAL на DependencyType.REQUIRED в строках 416 и 426 в org.jboss.as.ejb3.subsystem.EJB3SubsystemAdd.

Вы можете загрузить исправленный файл (для WildFly 8.0.Final) и перезапишите существующий файл в wildfly / modules / system / Layers / base / org / jboss / as / ejb3 / main / wildfly-ejb3-8.0.0.Final.jar . Применение этого патча решит вашу проблему.

person Vladimír Schäfer    schedule 20.04.2014