EJB客户端访问
因为EJB是一个重量级的框架,拿常用的会话EJB来说,本地EJB还不如J2EE的CDI,所以只有远程EJB才是EJB的核心内容。远程EJB的访问协议有很多种,有HTTP协议、HTTPS协议、netty等等。
要写一个完整的EJB客户端,项目中必须有这么几个东西:
1 EJB客户端调用库
2远程EJB的客户端接口
3 配置
4 访问代码(这个有点画蛇添足,哈哈)
一 首先看第一个,EJB调用库。EJB调用库,网上有很多,各个厂商都有实现,我选择的是jboss的实现。其maven项目信息如下:
<dependency>
<groupId>org.jboss</groupId>
<artifactId>jboss-ejb-client</artifactId>
<version>2.1.8.Final</version>
</dependency>
二 远程EJB的客户端接口
这就需要远程EJB写成接口+实现的方式。如果自己在家里写着玩,可以直接把远程EJB的interface的Java文件拷贝进客户端项目。但是如果是生产项目,这样肯定不行,因为生成项目EJB太多了,靠手动拷贝,费时费力,如果服务端接口有变动的话,拷贝过去的代码不会跟着变动,这样就埋下了隐藏的bug。
如果是maven项目,在服务端可以生成EJB客户端。
服务端的maven配置需要动一动
<plugin>
<artifactId>maven-ejb-plugin</artifactId>
<configuration>
<ejbVersion>3.0</ejbVersion>
<generateClient>true</generateClient>
</configuration>
</plugin>
加上这个maven插件,在每次的maven打包之后就会生成客户端jar。Maven ejb插件会默认把以Bean,CMP,Session结尾的类从客户端中删除。
三 配置
在classpath的根目录下放入这个文件,这个文件是jboss ejb客户端的默认配置文件
jboss-ejb-client.properties
对于一般的ejb,配置文件写下面的内容就可以了
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=default
remote.connection.default.host=localhost
remote.connection.default.port = 8081
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
四 客户端代码
Ejb客户端是通过JNDI查找的,使用的是代理模式。
具体的代码是这个样子的,就是简单的jndi查找。
Hashtable<String,String> table = new Hashtable<String, String>();
table.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
InitialContext initialContext = new InitialContext(table);
HelloService lookup = (HelloService) initialContext.lookup("ejb:/ejb//HelloServiceBean!com.cjxnfs.ejbdemo.HelloService");
String greeting = lookup.greeting();
第一个ejb是协议名,第二个ejb是项目名。格式是什么呢?
ejb:[EAR名称]/[jar或者war名称]/
[显式bean名称]/[实现类]![接口完整类名]
如果是空的就可以不写哈。