WildFly 8 EJB查找失败,"没有可用的集群上下文"

时间:2014-04-10 14:09:19

标签: java-ee jboss ejb jndi wildfly

这是我需要完成的一个例子。有一个带有虚方法的远程EJB接口。接口由两个有状态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中的一切都很好。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

这似乎是WildFly中的一个错误。

WildFly希望初始化本地EJB客户端以进行群集,请参阅org.jboss.ejb.client.EJBClientContext, line 989

但是由于缺少对服务EJBRemoteConnectorService的依赖性而没有发生初始化,请参阅org.jboss.as.ejb3.remote.LocalEjbReceiver, line 449

org.jboss.as.ejb3.subsystem.EJB3SubsystemAdd, lines 416 and 426中,对EJBRemoteConnectorService的依赖性被定义为可选。问题是EJBRemoteConnectorService总是在LocalEjbReceiver服务之后初始化,因此在LocalEjbReceiver中始终为null。这会导致跳过集群初始化。

可以通过在org.jboss.as.ejb3.subsystem.EJB3SubsystemAdd中的第416和426行将DependencyType.OPTIONAL更改为DependencyType.REQUIRED来修补此问题。

您可以 download a patched file (for WildFly 8.0.Final) 并覆盖 wildfly / modules / system / layers / base / org / jboss / as / ejb3 / main / wildfly-ejb3-中的现有文件8.0.0.Final.jar 即可。应用此修补程序将解决您的问题。