開發(fā)EJB的客戶端
因?yàn)镋JB屬于業(yè)務(wù)層,通常它要被客戶端所調(diào)用
客戶端類型可以是:J2SE J2EE J2ME
才用普通的JAVA類開發(fā)客戶端:
新建 new一個Class 帶有main()方法
客戶端要調(diào)用EJB是要先通過JNDI去尋找EJB的承擔(dān)對象
JNDI是用于訪問命名目錄的API,也是JAVA EE中的規(guī)范
這里編寫的客戶端程序完全可以部署在另外一臺計算機(jī)上,只需要修改其中連接的服務(wù)器IP地址和啟動JBOSS時綁定相應(yīng)IP地址即可,這正事EJB的遠(yuǎn)程調(diào)用特性。
在37行返回的helloWorld實(shí)例對象并不是我們在服務(wù)器端編寫的HelloworldBean,而是一個也實(shí)現(xiàn)了HelloWorld接口的代理對象,這個代理對象最終遠(yuǎn)程調(diào)用我們自己編寫的HelloWorldBean,在第37行后加入了一行代碼:System.out.println(helloWorld.getClass().getName());
即可看到這個代理對象的類名
當(dāng)EJB發(fā)布到JBOSS時,如果我們沒有為它指定全局JNDI名稱或修改過其默認(rèn)EJB名稱,JBOSS就會按照默認(rèn)的命名規(guī)則為EJB生成全局JNDI名稱,默認(rèn)的命名規(guī)則如下:
把EJB應(yīng)用打包成后綴為*.jar的模塊文件,默認(rèn)的全局JNDI名稱是:
本地接口:EJB-CLASS-NAME/local
遠(yuǎn)程接口:EJB-CLASS-NAME/remote
EJB的接口實(shí)現(xiàn)類名(不加包名)
例:把HelloWorld應(yīng)用打包成HelloWorld.jar文件,他的遠(yuǎn)程接口JNDI名稱是:
HelloWorldBean/remote
把EJB作為模塊打包進(jìn)后綴名*.ear的JAVA
EE企業(yè)應(yīng)用文件,默認(rèn)全局JNDI名稱是:
本地接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local
遠(yuǎn)程接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote
EAR-FILE-BASE-NAME為ear文件的名稱,EJB-CLASS-NAME作為EJB的非限定類名
例:把HelloWorld應(yīng)用打包成HelloWorld.ear的企業(yè)應(yīng)用文件,他的遠(yuǎn)程接口JNDI名稱是:
HelloWorld/HelloWorldBean/remote
----------------------------------------------------------------
通過屬性文件,設(shè)置JNDI的上下文信息:
把硬編碼的代碼,放到配置文件中
Properties props = new Properties();
props.setProperty("java.naming.factory.initial"
props.setProperty("java.naming.provider.url", "localhost:1099");
就可以注釋掉了
在項目src下新建File 名稱為:jndi.properties
內(nèi)容:
java.naming.factory.initial =
org.jnp.interfaces.NamingContextFactory
java.naming.provider.url =
localhost:1099
保存,啟動JBOSS后,運(yùn)行客戶端也可執(zhí)行
在InitalContext cts = new InitalContext();
時,其構(gòu)造方法中默認(rèn)從類路徑下找jndi.properties文件
HelloWorld helloWorld = (HelloWorld)cts.lookup("HelloWorldBean/remote");
這句可能會報錯,解決方案是:
查看EJB的JNDI
進(jìn)入JBOSS的管理后臺 http://localhost:8080/
點(diǎn)JMX Console,找到j(luò)boss,點(diǎn)service = JNDIView
這個服務(wù)提供了一個list()方法,點(diǎn)Invoke按鈕,會列出JBOSS里面的資源
EJB部署后,生成的JNDI是在全局JNDI中(Global JNDI Namespace)
在其中找到EJB的JNDI名稱,如果找到了則發(fā)布成功
也有可能是jar包出了問題,重新導(dǎo)jar包