導讀
在本篇文章中你將瞭解到如何使用JBOSS7開發出一個簡單的EJB應用以及在這個過程中遇到的問題。 環境
MyEclipse10
JBOSS7
JDK1.8.0 準備 MyEclipse10中配置JBOSS7 瞭解JBOSS目錄結果
首先瞭解一下JBOSS7的目錄結構,和之前的版本不一樣
在 JBoss 7 中,檔案系統分為兩部分:
1. 獨立伺服器standalone
2. 網域服務器domain (這是 JBoss 7 首次引入的) — 用於統一的管理多個執行個體
bin: 包含啟動的指令碼,用來啟動獨立伺服器(如果使用獨立執行個體的話)或者域(使用網域服務器)
docs: 包含伺服器文檔,有兩個子目錄,分別是 licenses (licenses.xml 和相關內容) 和 Schema (配置所使用的 .xsd 檔案)
domain: 包含域結構,有子目錄組成:configuration (包含域的設定檔), data (包含發行模組的內容檔案夾), lib(用於支援 Java EE 擴充) tmp (臨時目錄).
standalone: 結構和 Domain 檔案夾相同
modules: 因為 JBoss 7 是一個模組化的伺服器,應用伺服器的模組對應這裡的一個子目錄。 配置JBOSS
配置JDK
運行JBOSS
開發EJB 建立EJB Project
編寫介面和實現
介面
package com.tgb.ejb;public interface FirstEjb { String saySomething(String name);}
實現
package com.tgb.ejb;import javax.ejb.Remote;import javax.ejb.Stateless;@Stateless@Remotepublic class FirstEjbBean implements FirstEjb { @Override public String saySomething(String name) { // TODO Auto-generated method stub return "你好"+name; }}
加入註解
上面的註解表示是無狀態的會話Bean(@Stateless)以及要通過遠程方式調用(@Remote)。 部署到JBOSS中並運行
開發用戶端 建立一個JavaProject 將用戶端和要調用的EJB建立聯絡 打包介面
在FirstEjb上右擊,選擇Export,並打包到ejb_01_client項目中
將打包好的jar包配置到用戶端
添加調用EJB需要依賴的jar包到用戶端
jar包在jboss安裝路徑下的bin\client中jboss-client.jar 編寫用戶端
package com.tgb.ejb;import java.util.Hashtable;import javax.naming.Context;import javax.naming.InitialContext;public class FirstEjbClient { public static void main(String[] args)throws Exception{ //JBOSS6,7之前 /*InitialContext context=new InitialContext(); FirstEjb firstEjb=(FirstEjb)context.lookup("FirstEjbBean/remote"); String s=firstEjb.saySomething("許晨陽"); System.out.println(s);*/ final Hashtable jndiProperties = new Hashtable(); jndiProperties.put(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming");//讓JNDI API知道是由誰來管理我們用來尋找JNDI 名字的命名空間的。 final Context context = new InitialContext(jndiProperties); //appName 和 moduleName分別就打包的格式而定 //如果是.ear就是appName,其它的是moduleName(.jar,.war) final String appName = ""; final String moduleName = "ejb_01"; final String distinctName = ""; //實作類別名 final String beanName = "FirstEjbBean"; System.out.println(beanName); //介面類名 final String viewClassName = FirstEjb.class.getName(); System.out.println(viewClassName); String jndi = "ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName; System.out.println(jndi); FirstEjb firstEjb = (FirstEjb) context.lookup(jndi); String s= firstEjb.saySomething("許晨陽"); System.out.println(s); }}
編寫設定檔jboss-ejb-client.properties
告訴用戶端EJB在哪
endpoint.name=client-endpointremote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=falseremote.connections=default remote.connection.default.host=127.0.0.1 remote.connection.default.port = 4448remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=falseremote.connection.default.username=saremote.connection.default.password=sa
運行用戶端
總結
1.在jboss-ejb-client.properties中配置host和port
remote.connection.default.host=127.0.0.1 remote.connection.default.port = 4448
開始host的配的是“localhost”,結果運行用戶端報錯:
WARN: Could not register a EJB receiver for connection to remote:localhost
所以改成了“127.0.0.1”;
連接埠號碼要根據JBOSS的standalone.xml檔案中的配置,預設是4447,我的改成了4448。
在這個過程中發現自己對standalone中的一些配置不是很清楚。可參考一下JBoss配置指南(三)
2.用戶端代碼中appName等的含義
appName:如果部署到伺服器的是一個.ear包,那麼app-name就為除去尾碼.ear之後的包名。如果部署的是.war包或普通的.jar包,那麼appName留空即可,我自己這個工程是以.jar包部署的,所以appName為空白。
moduleName:此處就是部署到伺服器上.war包或.jar包的名字,注意,moduleName不可為空。
distinctName:這是一個可選的用於指定在JBoss AS7上具體的部署配置的一個參數名,不需要使用的話,留空即可,此處我們留空。
beanName:這是我們要使用lookup尋找擷取的Bean,這個項目中為FirstEjbBean,即FirstEjb的實現Bean,無需全限定類名,beanName不可為空。
最後我們拼接處的路徑是
ejb:/ejb_01//FirstEjbBean!com.tgb.ejb.FirstEjb
如果是有狀態的EJB,那麼拼接的字串後面還要加上“。stateful”。