2015-10-02 55 views
1

我目前正在努力获取远程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的工作示例? 在此先感谢!

+0

好吧,我在我的调查中有点进一步。看起来客户端属性文件没有加载,因此EJB定位器没有连接细节。我通过使用-Djboss.ejb.client.properties.file.path VM-Argument将属性文件显式传递给进程,发现了这一点。在这种情况下,调用成功!但为什么这个属性文件没有从META-INF加载?为什么快速启动,...不工作?有没有变化? – shillner

回答

1

经常在写下问题和谈论问题后,我偶然发现了解决方案。

这个设置的问题是,jboss-ejb-client.properties文件还没有被客户端API加载,然后丢失了连接url ......

我不知道是否有必要放置这些属性的位置需要更改,还是我太笨了,无法正确读取它,或者我是否只修改了已损坏的教程。它甚至没有关系;)

解决的办法是将属性文件放在类路径上,而不是在JAR的META-INF目录下!

它现在正常工作,我可以注册客户端拦截器。