2014-04-10 63 views
2

下面是我需要完成的一個示例。有一個虛擬方法的遠程EJB接口。該接口由兩個狀態EJB實現,並且第一個需要執行第二的查找:WildFly 8 EJB查找失敗,並顯示「No cluster context available」

@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"); 
    } 
} 

helper類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

這似乎是WildFly中的一個錯誤。

WildFly預計本地EJB客戶端被初始化爲羣集,看到org.jboss.ejb.client.EJBClientContext, line 989

但初始化不發生因缺少相關的服務EJBRemoteConnectorService,看到org.jboss.as.ejb3.remote.LocalEjbReceiver, line 449

對EJBRemoteConnectorService的依賴性在org.jboss.as.ejb3.subsystem.EJB3SubsystemAdd, lines 416 and 426中定義爲可選。問題是EJBRemoteConnectorService始終在LocalEjbReceiver服務之後初始化,因此在LocalEjbReceiver中始終爲空。這會導致羣集初始化被跳過。

可以通過在org.jboss.as.ejb3.subsystem.EJB3SubsystemAdd的第416和426行上將DependencyType.OPTIONAL更改爲DependencyType.REQUIRED來修補該問題。

您可以download a patched file (for WildFly 8.0.Final)和覆蓋現有的文件中wildfly /模塊/系統/層/基層/組織/ JBoss的/ AS/EJB3 /主/ wildfly-ejb3-8.0.0.Final.jar。應用此修補程序將解決您的問題。