EJB 简介
背景:
? ? ? ?EJB 是 sun 的 JavaEE 服務器端組件模型,設計目標與核心應用是部署分布式應用程序。憑借 java 跨平臺的優勢,用 EJB 技術部署的分布式系統可以不限于特定的平臺。EJB (Enterprise JavaBean) 是 J2EE 的一部分,定義了一個用于開發基于組件的企業多重應用程序的標準。其特點包括網絡服務支持和核心開發工具(SDK)。 在 J2EE 里,Enterprise Java Beans(EJB) 稱為 Java 企業 Bean,是?Java?的核心代碼,分別是會話 Bean(Session Bean),實體 Bean(Entity Bean)和消息驅動 Bean(MessageDriven Bean)。
會話 Bean:
? ? ? ?會話 Bean( Session bean)在業務邏輯的實現中使用的頻率很高,它在 EJB 技術中成了很重要的一部分。 Session bean 有以下幾種特征:
? ? ? ?1、Stateless:這種 Session bean 在方法調用中不包含會話狀態,任何實例都可以被任意的客戶端調用。
? ? ? ?2、Stateful:這種 Session bean 包含會話狀態,一個實例只能被一個客戶端持有。
? ? ? ?3、Singleton:單例 session bean,只存在一個實例,并被所有客戶端共享,并支持同步調用。
消息驅動 Bean:
? ? ? ?消息驅動 Bean(Message-driven bean(MDB))?通過使用 JMS 接收異步消息來與外部其他系統集成。這個組件模型主要通過消息中間件 (MOM) 用來集成系統,MDB 通常帶業務邏輯給會話 Bean,現在開發一個 EJB 非常的簡單,一個簡單的 java 類和一個標注就能構成一個 EJB,如下所示:
@Stateless publicclass EJBTest {public Book methodOne(Long id) {// todo}public Book methodTwo(String param) {// todo}}EJB 容器功能:?
? ? ? ?EJB 是一個服務器端的組件,一個簡單的 java 類和一個標注就能構成一個?EJB,那 EJB 與普通 java 類的區別就是什么呢?那就是 EJB 必須要運行在 EJB 容器中,EJB 容器提供 EJB 所需要的運行環境,EJB 容器能夠提供如下的一些功能:
? ? ? ?1、遠程客戶端通訊( Remote client communication):?不需要編寫額外的代碼,一個 EJB 客戶例如:另一個 EJB、一個用戶接口,一個進程等等)端就可以通過標準的協議來遠程調用方法。
? ? ? ?2、依賴注入( Dependency injection):容器可以注入各種資源到 EJB 中(例如:JMS destinations andfactories, datasources,其他 EJB, 環境變量等等)。
? ? ? ?3、狀態管理( State management):對于有狀態會話 Bean,容器管理著它們的狀態。你可以為你的客戶端保持狀態。
? ? ? ?4、池( Pooling):對于無狀態會話 Bean 和消息驅動 Bean,容器池化一些實例,這些實例被多個客戶端共享。每次調用完畢,實例被放回到池中,而不是被銷毀。
? ? ? ?5、組件生命周期( Component life cycle):容器可靠地管理著組件的生命周期
? ? ? ?6、消息( Messaging) :容器允許 MDB 偵聽消息源并消費消息,并不使用太多的 JMS 探測
? ? ? ?7、事務管理( Transaction management):通過聲明式事務管理, EJB 可以使用標注來告訴容器它所需要的事務級別,容器管理著事務的提交與回滾。
? ? ? ?8、安全( Security):EJB 可以指定類或者方法級別的訪問控制,要求強制驗證用戶或者角色
? ? ? ?9、并發同步( Concurrency support):除了單例,一些并發申明是需要的,其他所有類型的 EJB 是默認線程安全的。你可以開發性能好的應用而不必擔心線程問題。
? ? ? ?10、攔截器( Interceptors):切入點( Cross-cutting concerns)可以放到攔截器中,容器會自動調用它。
? ? ? ?11、異步方法調用( Asynchronous method invocation) :在 EJB 中,可以不使用消息而實現異步調用
會話 Bean 子類型:
? ? ? ?會話 Bean 存在三種子類型:Stateless、Stateful 和 Singleton,用于創建不同類型的會話。
Stateless:
? ? ? ?無狀態會話 Bean 適用于只需單個請求會話即可完成的業務過程( 事務處理必須在一個方法中結束 )。這樣,EJB 組件不需要維護方法調用間的狀態變更信息。為了實現有效的 Bean 實例處理,EJB 容器經常會使用實例池技術。由于無狀態會話 Bean 不含會話狀態,因此同一無狀態會話 Bean 類的所有實例對于客戶而言都是等效的。而且無狀態會話 Bean 不保留歷史會話信息,所以它對于調用其本身的客戶也并不關注。因此,任何無狀態會話 Bean 都能夠服務任何客戶請求。因為這些無狀態會話 Bean 都是一樣的。?
Stateful:
? ? ? ?有狀態會話 Bean 適用于需要若干請求形成才可完成的業務過程。這樣,EJB 組件就需要維護方法調用間的狀態變更信息.?在有狀態會話 Bean 中各個 Bean 實例中存儲的狀態信息僅是單個客戶的。如果和無狀態會話 Bean 的處理一樣,只是簡單的將實例全部放置實例池中,當大量的并發客戶操作時,內存中運行的有狀態會話 Bean 實例就會過多而失去控制。
Singleton:
? ? ? ?Singleton 是 EJB 中會話 bean 的一種,容器會確保它在每個應用中只會實例化一次。它實現了單例模式。Singleton 在所有客戶端之間共享狀態。Singleton 是不能感知群集的。集群是一組容器緊密地合作(共享相同的資源,EJB 等等)。因此,在某些情況下,需要在好幾臺機器上部署分布式容器集群,每個容器將有它自己的 Singleton 實例。
總結:
? ? ? ?有狀態的 Bean 帶來了支持會話狀態的好處但同時付出了性能的代價。無狀態 bean 具有更好的性能,但卻又不具備與客戶端的親合力。struts2 中將 Action 和 ActionForm 合二為一,就有了狀態,因為每次請求都創建一個新的實例,所以沒有線程安全問題,而 struts1 就不能這么做了,struts1 的 Action 采用的是單例模式,僅有 Action 的一個實例來處理所有的請求,所以使用 struts1 的時候要特別小心,要保證 Action 的資源是線程安全最好采用無狀態。
有關消息驅動Bean:
????????消息驅動 bean 是一種通過消息方式為外界提供服務的組件。MDB 和它的使用者之間是一種松散耦合的關系.由于 MDB 組件在使用的過程中,其客戶并不擁有 MDB 組件的遠程引用,而是直接將消息發送到特定的隊列中,因而用戶的調用并不強求 MDB 組件的運行,在 MDB 組件沒有運行的情況下,客戶發送的請求數據會臨時保存到消息隊列中,當 MDB 組件加載后,消息隊列中的調用消息才能得到處理。javaee 規范并沒有規定 MDB 將處理結果返回給消息調用者的方式,但是通常情況下 MDB 組件是將處理完的結果以消息方式發送到特定結果隊列中,如果客戶程序沒有運行,結果會臨時存放在消息隊列中,直到客戶程序啟動,結果隊列中的消息才能得到處理。
? ? ? ?MDB 可以和兩種消息隊列關聯,如果和 Topic 型的隊列關聯,則客戶發送到隊列中的消息,會依次廣播給所有的 MDB 組件,所有的 MDB 組件會得到相同的消息。
? ? ? ?MDB 組件和具體的業務邏輯無關,從特定的消息隊列中獲得消息,消息內容要在 MDB 的 onMessage 方法中處理,具體的而業務邏輯通常委托給其他的 EJB 組件。
有關實體Bean:
????????實體 Bean 的主要作用就是維護數據的持久性,???實體 Bean 的主要作用就像開始時說的一樣是維護數據的持久性;會話 Bean 可以提供實現業務邏輯的方法;消息驅動 Bean 是基于 JAVA 消息技術的 EJB 對象,可以與 JMS 程序相配合,實現對消息列隊的操作。
總結