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名稱]/[實現類]![接口完整類名]
如果是空的就可以不寫哈。