当前位置: 首页 > 知识库问答 >
问题:

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

虞滨海
2023-03-14

这是我需要完成的一个例子。有一个带有虚拟方法的远程EJB接口。该接口由两个有状态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的查找并调用其方法。这是JBossEJB客户端。属性文件:

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个答案

董权
2023-03-14

这似乎是WildFly中的一个bug。

WildFly希望初始化本地EJB客户端以进行集群,请参见org。jboss。ejb。客户EJBClient上下文,第989行

但是由于缺少对服务EJBRemoteConnectorService的依赖关系,初始化没有发生,请参见org.jboss.as.ejb3.remote.LocalEjbRecader,第449行。

对EJBRemoteConnectorService的依赖关系在org中定义为可选的。jboss。像ejb3.子系统。EJB3子系统Add,第416和426行。问题是EJBRemoteConnectorService总是在LocalEjbReceiver服务之后初始化,因此在LocalEjbReceiver中总是为null。这会导致跳过群集初始化。

该问题可以通过更改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中的现有文件。最终的罐子应用此修补程序将解决您的问题。

 类似资料:
  • 我有以下... 也试过... 这是WAS6-8.5的一个港口项目

  • 我有一个Kubernetes集群,其中不同的pod在不同的名称空间中运行。我如何知道是否有pod出现故障? 是否有任何单个命令来检查失败的pod列表或重述的pod列表? 重新启动的原因(日志)?

  • 我试图从我的Spark2应用程序中使用Hadoop的copyToLocalFile函数将一个文件从HDFS复制到本地。

  • 命令在rest两个节点上运行,一切正常。当我想跑的时候 nodetool状态 命令时,我得到了这个错误消息

  • 我尝试为库伯内特斯设置一个haproxd的多主节点设置,如[1]中所述。我的网络配置是: haproc=192.168.1.213 master 0|1|2=192.168.1.210|211|212 worker0|1|2=192.168.1.220|221|222(此时不感兴趣) 所有主机都能够相互连接(DNS针对每个节点进行解析)。每个节点都运行 Ubuntu 18.04.3 (LTS)。泊

  • 当我们使用包“RMR”(RHadoop的一部分)并从RStudio中运行的R程序内部调用mapreduce()时,就会出现错误。 为了简化这篇文章,我展示了一个失败的非常简单的程序(其他更大的程序以相同的错误消息失败) 在R-Studio控制台上显示的错误有