首页 > 代码库 > 远程调用jboss as 7上部署的ejb出现No EJB receiver available for handling 异常

远程调用jboss as 7上部署的ejb出现No EJB receiver available for handling 异常

昨天倒腾了一天终于配置好了jboss as 7的域,今天又倒腾了一整天在上面部署了个EJB,然后试了一个利用JNDI来进行远程调用。下面记录一下过程中那些乱七八糟的问题:

首先是这个jboss-client.properties文件,各个属性值的含义可以从jboss的官方文档上得到解释https://docs.jboss.org/author/display/AS71/EJB+invocations+from+a+remote+client+using+JNDI

1 endpoint.name=client-endpoint2 remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false3 remote.connections=default4 remote.connection.default.host=192.168.1.335 remote.connection.default.port=44476 remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false7 remote.connection.default.username=mosmith8 remote.connection.default.password=MTIzNDU2

 

endpoint.name是个可选的参数,用于EJB Receiver创建连接所用的名称,如果不设置将使用默认值:config-based-ejb-client-endpoint

remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false官方上说是用在创建connection provider 上处理 remote://协议的参数,但具体是什么没有说,照这名字看来好像与安全有关的(纯属猜测)

remote.connections=default,这是指定连接配置名的,我们可以创建多个配置,具体做法请看官方文档

上面需要注意的是:

username是Jboss中application user 中的用户

password这个属性是用用户密码的base64编码。

下面是我的程序远程调用代码,基本和官方给出的一样:

 1 package com.bes.training.ejb.EJBRemoteInvocation; 2  3 import com.bes.training.ejb.Helloworld.*; 4  5 import javax.naming.*; 6 import java.util.*; 7  8 public class RemoteInvocationDemo { 9     public static void main(String[] args){10 11         Hashtable<String,String> jndiProperties=new Hashtable<String,String>();12         jndiProperties.put(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming");13         //jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY,"org.jboss.naming.remote.client.InitialContextFactory");14         jndiProperties.put("jboss.naming.client.ejb.context","true");15         16         try{17             Context context=new InitialContext(jndiProperties);18             Object obj=context.lookup("ejb:/temp//SayHelloImpl!com.bes.training.ejb.Helloworld.SayHelloImplRemote" );19             20             SayHelloImplRemote intf=(SayHelloImplRemote) obj;21             String result=intf.sayHello("Mosmith");22             System.out.println(result);23             24         }catch(NamingException e){25             System.out.println(e.getMessage());26             e.printStackTrace();27         }28     }29 }

但是在eclipse中运行的时候出现了No EJB receiver available for handling的异常:倒腾了好长时间,于是怀疑-Djboss.ejb.client.properties.file.path=jndi.properties参数没有起作用,于是在命令行下运行了一下,正常!回eclipse仔细检查,发现是参数的设置错了:

应该设置在VM arguments而不是Program arguments里。初学者一定要注意这里的区别啊。

 

远程调用jboss as 7上部署的ejb出现No EJB receiver available for handling 异常