【新炬網路名師大講堂】weblogic整合ejb

shsnchyw發表於2014-12-15

EJB是一個可重用的,可移植的J2EE元件。 EJB由封裝了業務邏輯的多個方法組成。例如,一個EJB可以有包括一個更新客戶資料庫中資料的方法的業務邏輯。多個遠端和本地客戶端可以呼叫這個方法。另外,EJB執行在一個容器裡,允許開發者只關注與bean中的業務邏輯而不用考慮象事務支援,安全性和遠端物件訪問等複雜和容易出錯的事情。EJB以POJO或者普通舊的Java物件形式開發,開發者可以用後設資料註釋來定義容器如何管理這些Bean。

下面詳細介紹ejb的 基礎知識,為下一步的開發做好充分準備。

1、ejb 基礎知識

(1) 無狀態會話bean

不儲存客戶機的會話狀態

好處:使用小量的例項即可滿足大量的客戶。每個例項都沒有標識,相互之間是等價的。

等冪的無狀態會話bean: 多次和一次呼叫的結果和效應相同。

在叢集中能負載均衡 a 機器失敗,能在b機器上重試

非等冪的無狀態會話bean: 如:計數器

不能自動因故障而進行轉換。

(2) 有狀態會話bean

儲存客戶機的會話狀態

特點: 在有會話狀態會話的bean例子中,出納員的數量等於活動的顧客的數量,這能簡化程式設計模式

weblogic 透過記憶體複製技術 在叢集中進行負載均衡

記憶體複製技術: 每個有會話狀態的bean例項都將儲存在兩個伺服器的記憶體中,一個伺服器作為主伺服器,另一個作為輔助伺服器。

如果主失敗,輔助變為主,然後自動選擇別的可用的伺服器作為輔助。

遺憾: 非常難在Servlet 和JSP中用好有狀態會話bean。可能會發生並發現象,產生RemoteException

weblogic 的 能封鎖所有併發的呼叫。

同步: 能有選擇地實現 Javax.ejb.SessionSynchronization介面

afeterBegin() //進入事務時

beforeCompletion() //提交事務前,用於提交前把快取的資料寫到資料庫中.

afterCompletion() //提交事務後,用於釋放共享資源或更新事務提交和終止方面的統計資訊.

會話bean透過其 SessionContext 物件中的 getUserTransaction() 方法,取得對UserTransaction的應用

通常 SessionContext 被存放在成員變數中

** 記住是在呼叫ejb.create()方法前呼叫 setUserTransaction() 方法

利用對 UserTransaction 的引用會話能使用 begin() 、commit()、rollback() 方法界定一個事務.

(3) 實體 bean:

他有一個主健作為唯一的識別符號

組成部分: 由本地介面、遠端介面、bean類、主健類和設定描述器組成。

本地介面:

擴充套件了javax.ejb.EJBHome介面,包括create()、remove()、finder 和home等方法

1)create()方法呼叫bean類中的ejbCreate()方法。相當於資料的insert 方法。

2)remove()方法相當於資料庫的delete操作。

3)finder()方法,使客戶能夠查詢和接收滿足查詢條件的實體bean的引用。每個實體bean的本地介面中都必須

有一個findByPrimaryKey() 方法

4)home 方法,類似於無狀態會話bean。

主健類:

實體bean必須包括一個主健類,主健類用於標識實體bean例項,而且實體bean資料型別必須是唯一的。

主健類能是java的基本型別String Integer 也能是使用者自定義的。

也能是多個欄位的主健的複合主健。

bean 類和bean的上下文環境:

實現javax.ejb.EJBObject 介面,其中包含業務方法的語法格式定義.

bean 類實現了javax.ejb.EntityBean介面,同javax.ejb.SessionBean介面相同,EntityBean 介面包含了EJB

容器呼叫bean例項的語法格式.

在bean的構造器執行之後,即時呼叫setEntityContext() 方法,同時把bean例項的EntityContext 傳遞給他.

bean類實現了home方法和遠端介面中的業務方法,home方法是針對匿名例項的方法不應使用有關的主健值.

 

分為:

容器管理永續性(Container-Managerd Persistence)CMP

特點: EJB 容器自動生成,用於把實體bean的資料寫入到資料庫中。

好處: bean作者能避免編寫實體bean和關聯式資料庫資料訪問方面的程式碼。cmp將自動處理這一過程。

個性: 每一個cmp 實體bean 都有一組容器管理的欄位,這些欄位儲存在資料庫,並可從中載入.通常,每個容器管理的欄位都對應於

關聯式資料庫中的一個列.

容器管理的每個欄位必須在ejb-jar.XML中定義,這使容器能夠把容器管理的欄位和bean類中的set和get方法進行匹配比較.

另外,bean作者能增加另外一個cmp設定描述檔案 weblogic-cmp-rdbms.xml,其中包含資料庫表名和每個容器管理的字

段和相應的資料列的對映.

 

bean管理永續性(Bean-Managerd Persistence ) BMP

特點: 在bmp實體中,bean作者需要自己編寫資料庫訪問程式碼,也就是編寫JDBC程式碼,插入、刪除和查詢資料庫中的實體bean資料。

好處: 能讓bean的作者完全靈活的處理實體bean的永續性資料,因為作者需要寫資料訪問的程式碼,他幾乎能使用所有永續性存

儲方式ejb2.0 cmp提供實體bean之間的標準關係對映,使容器能自動管理業務物件之間的互動。

cmp擁有更多的訪問控制,因此cmp比bmp有較好的效能。

 

(4) 訊息 bean

把JMS 和EJB 成功結合在一起,整合的結果

特點:客戶機不必呼叫訊息bean 相反: 客戶機只需要發一個訊息給jMS目的。

在訊息到達以後,訊息bean的onmessage()方法將被呼叫,以處理這個訊息。

訊息bean用於在伺服器中執行非同步操作。

 

2。EJB 組成

(1)遠端介面

public interface HelloWord extents EJBObject

//EJBObject 介面方法

EJBHome getEJBHome() throws RemoteException;

Object getPrimaryKey() throws RemoteException;

void remove() throws RemoteException, RemoveException;

Handle getHandle() throws RemoteException;

boolean isIdentical(EJBObject ejbObject) throws RemoteException;

(2)本地介面

本地介面是ejb工廠,客戶機能使用本地介面建立、找出和刪除ejb例項。只需寫本地介面中的方法的語法呼叫格式

public class HelloWorldHome extends EJBHome

//EJBHome 介面方法

void remove(Handle handle) throws RemoteException, RemoveException;

void remove(Object o) throws RemoteException, RemoveException;

EJBMetaData getEJBMetaData() throws RemoteException;

HomeHandle getHomeHandle() throws RemoteException;

// Home

public HelloWorld create() throws CreateException, RemoteException;

(3)bean 類

public class HelloWorldBean implements SessionBean

// SessionBean 中的方法

public void setSessionContext(SessionContext sessionContext)

/**呼叫次方法會話結束*/

public void ejbRemove()

//ejb透過待命和活動的機制,管理一組正在工作的有狀態會話bean例項

/**活動*/

public void ejbActivate()

/**待命*/

public void ejbPassivate()

// bean類

// 每個home 的create 方法對應一個ejbCreate()方法

// 有會話狀態有非常多不同版本的create()方法。而create 方法必須有ejbCreate()方法和之一一對應

public void ejbCreate()

 

不要在ejb類中類中實現遠端介面

3. EJB 設定描述器

(1)ejb-jar.xml

(註釋)

HelloWorld(ejbname)

com.dhc.helloworld.HelloWorldHome(本地介面類)

com.dhc.helloworld.HelloWorld(遠端介面類)

com.dhc.helloworld.HelloWorldBean(bean類)

Stateless(無狀態會話)

Bean(bean管理的事務)

ShoppingCartEjb

*(說明ShoppingCartEjb的預設事務屬性指定為Required)

Required(容器管理的事務使用的屬性 Nerver、NotSupported

、Supports、Mandatory、Required、RequiredNew)

(2)weblogic-ejb-jar.xml (註釋)

HelloWorld(ejb名稱)

HelloWorldEJB(jndi名稱)

10(限制不會有超過10個無狀態會話bean併發執行)

10(放到記憶體快取中的有狀態會話bean的最大數量)

 

4 . 建立ejb 檔案檔案

com/dhc/helloworld/(package)

com/dhc/helloworld/HelloWorld(遠端介面)

com/dhc/helloworld/HelloWorldHome(本地介面)

com/dhc/helloworld/HelloWorldBean(bean類)

META-INF

META-INF/ejb-jar.xml(設定描述器)

META-INF/weblogic-ejb-jar.xml(weblogic伺服器設定描述器)

說明: META-INF 必須為大寫

 

5 . 容器管理的事務

Nerver : 不參和事務,如果參和產生RemoteException

NotSupported: 不能參和

Supports: 如果呼叫者正在參和事務,相應的EJB呼叫也能參和事務,否則不能

Mandatory 如果呼叫者有一個事務,相應的EJB能參和事務,否則,TransactionRequiredException

Required 如果呼叫者有一個事務,相應的EJB能參和事務,否則,容器將在呼叫相應的EJB之前,開始一個事務.

當方法呼叫完成以後,即提交該事務.

RequiresNew 在呼叫相應的EJB之前,開始一個新的事務,當方法呼叫返回時,即提交這個事務.

 

6、ejb 引用

在ejb-jar.xml

an EJB reference to the Widget EJB(描述)

ejb/WidgetEJB

session

com.dhc.WidgetHome

com.dhc.Widget

 

在 weblogic-ejb-jar.xml

ejb/WidgeEJB

DeployedWidge

 

程式

Content ctx = new InitialContent();

Object h = ctx.lookup(“java:/comp/env/ejb”); //環境變數是隻讀的,而且是當前ejb的本地變數.

WidgetHome home = (WidgetHome)PortableRemoteObject.narrow(h,WidgeHome.class);

 

7. 資源管理器的引用

定義資源管理的引用

例子: 建立 jdbc、DBPool和JDBC資料來源的對映

在ejb-jar.xml

(描述)

jdbc/BDPool

javax.sql.DataSource

Container

 

在 weblogic-ejb-jar.xml

jdbc/DBPool

DBPool

 

config.xml

 

name=”DBPool”

Targets=”myserver”

JDDIName=”DBPool” (jndi名稱)

PoolName =”DevelopmentPool”

/>

 

引用的好處

我們用大量的對映和設定,才建立了資源管理器的引用,不過還是非常值得的。

以為便於部署人員重新設定應用而不必修改實際的bean類程式碼。甚至也不必修改ejb的設定描述器

java bean 程式碼

Content ctx = new InitialContent();

DataSource dataSource = (DataSource)ctx.lookup(“java:/comp/env/jdbc/DBPool”);

 

8 . 控制程式碼: 作為一個序列化的物件,控制程式碼中封裝了足夠的資訊,以便重建對EJBObject的引用。

控制程式碼可用於在兩個相互合作的程式中傳遞EJBObject的引用。接受程式即可從控制程式碼中取得EJBObject的引用。

 

為了取得控制程式碼,能呼叫EJBObject介面的getHandle()方法,返回一個Handle例項

為了重建EJBObject 引用。能使用Handle 介面的getEJBObject()方法。

例子:

HelloWorld hw = home.create();

javax.ejb.Handle handle = hw.getHandle();

HelloWorld helloworld = (HelloWorld)PortableRemoteObject.narrow(handle.getEJBObject(),HelloWorld.class);

 

HomeHandle:

類似handle ,但不能用於引用EJBObject

HomeHandle 包含足夠的資訊,能重建EJBHome()的引用。

差異:

是呼叫 getHomeHandle()方法 和getEJBHome()方法

例子片斷:

Content ctx = new InitialContext();

Object h = ctx.lookup(“HelloWorldEJB”);

HelloWorldHome home = (HelloWorldHome)PortableRemoteObject.narrow(h,HelloWorldHome.class);

HomeHandle homehandle = home.getHomeHandle();

Object nh = homehandle.getEJBHome();

HelloWorldHome newHomeReference = (HelloWorldHome)PortableRemoteObject.narrow(nh,HelloWorldHome.class);

好處:

他們能自動的儲存重建引用所需的資訊

 

9.使用事務的技巧:

(1) 一個事務不要涉及太多的操作.

(2) 容器管理和bean管理的事務

事務既耗費應用伺服器中的資源,又耗費資料庫資源,所以事務越短越好.

儘量使用容器管理事務而不要採用bean管理事務的方式.

(3) ejb遇見錯誤,需要強制事務回滾. 使用EJBObject.setRollbackOnly();

(4) 不能讓事務涉及web層和表示邏輯

(5) 企業應用中不應當選用supports 事務屬性,因為只有呼叫者開始一個事務後,ejb才能在事務中執行。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29960155/viewspace-1368316/,如需轉載,請註明出處,否則將追究法律責任。

相關文章