这是我需要完成的一个例子。有一个带有虚方法的远程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中的一切都很好。
任何帮助都将不胜感激。
答案 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 即可。应用此修补程序将解决您的问题。