wildfly-9.0.2.Final - 来自远程服务器的 EJB 调用

wildfly-9.0.2.Final - EJB invocations from a remote server

我正在从另一个 WildFly 服务器实例查找和调用部署在 WildFly 服务器(目标服务器)实例上的 EJB。为此,我正在关注 link - 'https://docs.jboss.org/author/display/WFLY9/Developer+Guide#DeveloperGuide-EJBinvocationsfromaremoteserver'

test.jar 已部署到目标服务器。以下是部署日志。

16:34:46,545 INFO  [org.jboss.weld.deployer] (MSC service thread 1-6) WFLYWELD0010: Stopping weld service for deployment test.jar
16:34:46,569 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-7) WFLYSRV0028: Stopped deployment test.jar (runtime-name: test.jar) in 40ms
16:34:46,573 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-3) WFLYSRV0027: Starting deployment of "test.jar" (runtime-name: "test.jar")
16:34:46,588 INFO  [org.jboss.weld.deployer] (MSC service thread 1-5) WFLYWELD0003: Processing weld deployment test.jar
16:34:46,595 INFO  [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-5) JNDI bindings for session bean named TestHelperBean in deployment unit deployment "test.jar" are as follows:

java:global/test/TestHelperBean!moc.test.ejb.session.TestHelperLocal
java:app/test/TestHelperBean!moc.test.ejb.session.TestHelperLocal
java:module/TestHelperBean!moc.test.ejb.session.TestHelperLocal
java:global/test/TestHelperBean!moc.test.ejb.session.TestHelperRemote
java:app/test/TestHelperBean!moc.test.ejb.session.TestHelperRemote
java:module/TestHelperBean!moc.test.ejb.session.TestHelperRemote
java:jboss/exported/test/TestHelperBean!moc.test.ejb.session.TestHelperRemote

16:34:46,610 INFO  [org.jboss.weld.deployer] (MSC service thread 1-5) WFLYWELD0006: Starting Services for CDI deployment: test.jar
16:34:46,614 INFO  [org.jboss.weld.deployer] (MSC service thread 1-1) WFLYWELD0009: Starting weld service for deployment test.jar
16:34:46,834 INFO  [org.jboss.as.server] (XNIO-1 task-3) WFLYSRV0016: Replaced deployment "test.jar" with deployment "test.jar"

无状态会话 bean 已部署到目标服务器。

package moc.test.ejb.session;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.ejb.Local;
@Stateless
@Remote (TestHelperRemote.class)
@Local(TestHelperLocal.class)
public class TestHelperBean implements TestHelperRemote,TestHelperLocal
{
public boolean testFunction() throws Exception
{
    try
    {
        System.out.println("[TestHelperBean][testFunction]");
    }catch(Exception e)
    {}
    return false;
}
}

以下是调用 test.jarbean 实例的客户端代码。

package com.testmodule.pojo;
import java.util.Hashtable;
import javax.naming.Context;
import moc.test.ejb.session.TestHelperRemote;
public class Test { 
public void getDbConnection(){
    try{
        final Hashtable<String, String> props = new Hashtable<String, String>();            
        props.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); // setup the ejb: namespace URL factory         
        final Context context = new javax.naming.InitialContext(props); // create the InitialContext
        final TestHelperRemote bean = (TestHelperRemote) context.lookup("ejb:" + "" + "/" + "test" + "/"
                + "" + "/" + "TestHelperBean" + "!" + moc.test.ejb.session.TestHelperRemote.class.getName());
        bean.testFunction();                        
    }
    catch(Exception e){e.printStackTrace();}

但在 运行 时发生了以下错误

15:58:48,972 ERROR [stderr] (default task-1) java.lang.IllegalStateException: EJBCLIENT000025: No EJB receiver available for handling [appName:, moduleName:test, distinctName:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@46e20ef9
15:58:48,973 ERROR [stderr] (default task-1)    at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:774)
15:58:48,974 ERROR [stderr] (default task-1)    at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:116)
15:58:48,974 ERROR [stderr] (default task-1)    at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:186)
15:58:48,975 ERROR [stderr] (default task-1)    at org.jboss.ejb.client.EJBInvocationHandler.sendRequestWithPossibleRetries(EJBInvocationHandler.java:255)
15:58:48,975 ERROR [stderr] (default task-1)    at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:200)
15:58:48,976 ERROR [stderr] (default task-1)    at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:183)

为什么会出现这个错误?

您的客户端(即尝试调用服务的代码)在 Wildfly 实例 1 上,而您的服务器(即部署您的 ejb 的地方)在实例 2 上。我们假设实例 1 运行在默认端口 8080 上,而实例 2 在端口 8180 上 运行。

link you used in your question 有一个名为 在客户端服务器上创建安全领域 的部分,它描述了创建 "outbound-socket-binding" 和 "remote-outbound-connection." 我不确定你是否已经这样做了。如果没有这一步,实例 1 上的应用程序将不知道如何连接到实例 2 上的服务。

如果你不想走配置路线, 上有一篇很好的文章。这项技术对我有用,可能会帮助您找到自己的解决方案。使用此解决方案,您可以指定连接到第二个 Wildfly 实例上托管的 ejb 所需的服务器地址、端口(在此示例中为 8180)、用户名和密码。