JBoss7配置EJB客户端出错:No EJB receiver available for handling的解决

来源:互联网 发布:bim建模软件下载 编辑:程序博客网 时间:2024/06/03 13:51

刚开始使用JBoss服务器时,在Myeclipse中编写EJB客户端调用远程JBoss服务器上的无状态会话bean时,总是报错:


Exception in thread "main" java.lang.IllegalStateException: No EJB receiver available for handling [appName:,modulename:HelloWorld,distinctname:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@35ab28fe
    at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:584)
    at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:119)
    at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:181)
    at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:136)
    at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:121)
    at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:104)
    at $Proxy0.sayHello(Unknown Source)
    at cn.mym.test.EJBClient.main(EJBClient.java:34)


重点看No EJB receiver available for handling



这是因为没有链接到远程JBoss(注:这里所说的远程是指,把无状态的会话bean打包后发布在JBoss服务器上,并且服务器开启,然后本客户端通过JNDI与JBoss建立连接,然后得到发布的无状态的会话bean,最后通过EJB代理实例化对应的对象,然后就可以使用发布在JBoss上的无状态会话bean中的方法)

贴上客户端代码(未修改前,即会报错):

public class EJBClient {/** *<p>title:main</p> *@author 明柯 * @param args * @throws NamingException  */public static void main(String[] args){Properties props=new Properties();        props.setProperty(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming");        try        {            Context context=new InitialContext(props);            HelloWorld hello=(HelloWorld)context.lookup("ejb:/HelloWorld//HelloWorldBean!"+HelloWorld.class.getName());            System.out.println(hello.sayHello("dara"));        }        catch(NamingException e)        {            e.printStackTrace();        }}}

注:lookup中的参数值,即JNDI的写法与JBoss6及以下版本不一样,具体参考:http://blog.csdn.net/maoyuanming0806/article/details/71122697

或者参考JBoss的官方文档,官方文档我已经上传,下载地址:http://download.csdn.net/detail/maoyuanming0806/9831962


解决:

在classpath路径下需要添加一个JBoss的配置文件,此配置文件格式在官方文档中也可以找到

这里我放在src下:

文件名:jboss-ejb-client.properties    (文件名称固定写法

endpoint.name=client-endpointremote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=falseremote.connections=defaultremote.connection.default.host=127.0.0.1remote.connection.default.port = 4447remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=falseremote.connection.default.username=appuserremote.connection.default.password=apppassword

解释:一共八行
1.代表名称用于创建endpoint的客户端
2.通过设置org.xnio.Options.SSL_ENABLED值为false使得在链接提供者创建连接时使用remote.connection.default.connect.options作为前缀        (一般不用改)
3.表示设置与远程服务器的链接数。默认(default)表示设置单个远程链接。可以设置多个:remote.connections=one, two
  如上设置多个表示设置了两个EJB接收者,你需要添加EJB客户端
4.5.6 分别是主机(可以是localhost)、默认远程端口(除非修改过,否则默认是4447)、此客户端的链接方式(固定);多个连接则此三步就有多次设置
7.8 分别是管理员用户名和密码。官方文档是说必须要设置,为了安全起见:官方文档原话:The user and password must be set because the security-realm is enabled for the subsystem remoting (see standalone*.xml or domain.xml) by defaul


加入此文档后,编译运行客户端结果如下:





解释是根据官方文档自己的理解,若有翻译不当之处,敬请指出,在此感谢,  以上详细说明见官方文档的Local JNDI章节的远程EJB的说明

0 0
原创粉丝点击