我目前正在努力获取远程EJB调用以使用wildfly(8.x和9.x)。无法通过Wildfly获得远程EJB与EJB客户端API一起工作
详细说明它是关于使用EJB客户端API方法从独立客户端应用程序(而不是从另一个应用程序服务器)进行的远程调用。远程命名方法适用于我,但不适用于我的方案,因为我需要使用客户端拦截器将上下文数据传递给远程调用的服务器端拦截器。
但现在我尝试使用客户端API获取远程调用,以便为一个简单示例工作。因此,我尝试了github上提供的远程ejb调用快速入门(wildfly/quickstart/ejb-remote)。关键是,这个快速启动引发了与我在简单示例应用上相同的错误。这里是我的应用程序的一些细节:
我的远程接口:
package test.ejb;
public interface HelloRemote {
String greet(String name);
}
我Bean实现:
package test.ejb;
import javax.ejb.Remote;
import javax.ejb.Stateless;
@Stateless(name = "Hello")
@Remote(HelloRemote.class)
public class HelloBean implements HelloRemote {
public String greet(String name) {
return "Hello " + name;
}
}
bean的远程视图在服务器上正确注册(在导出命名空间中):
java:jboss/exported/ejb-test-backend.jar/Hello!de.coryx.HelloRemote
这里现在客户端:
我的主要类:
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.jboss.ejb.client.EJBClientContext;
import test.ejb.HelloRemote;
public class Main {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
props.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
Context context = new InitialContext(props);
String jndiLookup = "ejb:/ejb-test-backend.jar/Hello!" + HelloRemote.class.getName();
HelloRemote hello = (HelloRemote) context.lookup(jndiLookup);
System.out.println(hello.greet("World"));
}
}
的jboss-ejb-client.properties(包装在罐子/ META_INF):
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
当我执行主要方法时,我得到以下错误信息(相同
Exception in thread "main" java.lang.IllegalStateException: EJBCLIENT000025: No EJB receiver available for handling [appName:, moduleName:ejb-test-backend.jar, distinctName:] combination for invocation context [email protected]
at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:774)
at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:116)
at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:186)
at org.jboss.ejb.client.EJBInvocationHandler.sendRequestWithPossibleRetries(EJBInvocationHandler.java:255)
at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:200)
at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:183)
at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:146)
at com.sun.proxy.$Proxy0.greet(Unknown Source)
at Main.main(Main.java:16)
当我使用远程命名方法,一切都很好:
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
props.put(Context.PROVIDER_URL, "http-remoting://127.0.0.1:8080");
props.put("jboss.naming.client.ejb.context", true);
props.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
props.put("jboss.naming.client.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT", "false");
Context context = new InitialContext(props);
String jndiLookup = "/ejb-test-backend.jar/Hello!" + HelloRemote.class.getName();
HelloRemote hello = (HelloRemote) context.lookup(jndiLookup);
System.out.println(hello.greet("World"));
输出这里是(预期):尝试,我上面提到的wildfly快速启动)时发生的事情
Hello World
所以有人知道这里或更好的可能是什么错,谁有使用EJB客户端API在Wildfly上远程调用EJB的工作示例? 在此先感谢!
好吧,我在我的调查中有点进一步。看起来客户端属性文件没有加载,因此EJB定位器没有连接细节。我通过使用-Djboss.ejb.client.properties.file.path VM-Argument将属性文件显式传递给进程,发现了这一点。在这种情况下,调用成功!但为什么这个属性文件没有从META-INF加载?为什么快速启动,...不工作?有没有变化? – shillner