使用eclipse进行开发,创建一个普通的java工程,导入java-client.jar,这个jar包在bin/client目录下
1. 定义一个接口
public interface HelloWorldRemote {}
如果指定HelloWorldRemote 为local接口,那么在remote client就无法访问这个ejb
Local接口和remote接口也不可以是同一个接口
}
这里不能使用ejb:helloworld1//HelloWorldRemoteBean!com.alex.wang.HelloWorldRemote来访问
否则报Exception in thread "main" java.lang.IllegalStateException: EJBCLIENT000025: No EJB receiver available for handling [appName:helloworld1, moduleName:, distinctName:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@1af691b
原因应该是jndi前缀名为ejb:,但是我们没有指定其对应的interceptor
HelloWorld world =(HelloWorld)ctx.lookup("java:global/helloworld1/HelloWorldBean!com.alex.wang.HelloWorld");
根据调用ejb与被调用ejb位置的关系,我们可以采用不同的jndi来进行调用(java:global,java:app,java:module)
上述的试验也说明在ejb3中,无需定义ejb-jar.xml
为什么通过4447端口可以获得ejb呢
原因是在jboss server的standalone.xml中定义了remoting模块
<extension module="org.jboss.as.remoting"/>
其相关的配置为
<subsystem xmlns="urn:jboss:domain:remoting:1.1">
<connector name="remoting-connector" socket-binding="remoting" security-realm="ApplicationRealm"/>
</subsystem>
其指定绑定端口为remoting
在<socket-binding-group中了定义其对应4447端口
<socket-binding name="remoting" port="4447"/>
而在 <subsystem xmlns="urn:jboss:domain:ejb3:1.3">,定义了其remote 访问使用的是前面定义的remoting-connector
<remote connector-ref="remoting-connector" thread-pool-name="default"/>
所以通过4447端口,remote 协议可以访问到ejb