天天看點

EJB 3.1五大模式改進令Java EE 6更好用之二

異步會話Bean調用

  EJB 3.1引入了一個強大功能,那就是可以異步調用會話Bean方法。對于一個異步調用,允許會話Bean執行它的操作時,用戶端并行處理其它事情。

  通過@Asynchronous注解讓一個方法支援異步,也可以使用一個部署描述符将一個方法指定為異步的。

  異步方法可以傳回一個java.util.concurrent.Future<V>或void對象,Future<V>對象容納了異步操作傳回的結果,你可以通路Future<V>對象檢索一個結果值,檢查異常或取消一個正在進行中的調用。Future<V>接口提供一個get()方法檢索值,當然,你也可以其它合适的類檢索值,如 AsyncResult<V>,實際上它自己實作了一個Future<V>接口。

  在下面的例子中,performCalculation()方法是異步的,它使用AsyncResult<V>類檢索Future<V>對象傳回的值。

  [email protected]

  2. Public class CalculatorBean implements CalculatorService {

  3. ...

  4.

  5. @Asynchronous

  6. public Future<Integer> performCalculation(...) {

  7.

  8. // ... do calculation

  9.

  10. Integer result = ...;

  11. return new AsyncResult<Integer>(result);

  12. }

  13. }

  14.

  簡化打包

  EJB規範始終要求企業Bean打包到一個叫做ejb-jar檔案的企業子產品中,因為它一般用于Java EE Web應用程式,這種打包方法顯得有些累贅,應用程式被強制使用一個Web應用程式使用的歸檔檔案(.war),一個企業Bean使用的ejb-jar檔案,還有一個包含其它包的企業歸檔檔案(.ear),如圖1所示,這種打包方法非常複雜,它需要指定子產品之間共享的類和資源。

  EJB 3.1解決了這個問題,簡化了打包的複雜程度,徹底消除了企業Bean類必須打包進ejb-jar檔案的限制,如圖2所示,現在你可以直接将EJB類放到.war檔案中,使用打包Web應用程式類相同的打包規則,這意味着你可以将EJB類放到WEB-INF/classes目錄下,或者放到WEB- INF/lib目錄下的一個.jar檔案中。EJB部署描述符也是可選的,如果你需要它,你可以将EJB部署描述符打包到WEB-INF/ejb- jar.xml檔案中。

  輕量級EJB(EJB Lite)

  對許多應用程式而言,EJB提供了比應用程式真正需要的多得多的功能,使用EJB的應用程式通常隻需要使用EJB 3.1的一個子集,輕量級EJB就是為滿足這種需要誕生的。

  輕量級EJB簡化了許多開發人員使用EJB,使用輕量級EJB的開發人員在他們的應用程式中需要學習使用一部分功能即可。此外,使用輕量級EJB開發的應用程式可以運作在輕量級EJB或全功能EJB 3.1 API實作的應用程式伺服器上。

  注意,輕量級EJB不是一個産品,它是EJB 3.1 API的一個子集,輕量級EJB的目标是提供EJB 3.1的一個子集,滿足大多數應用程式業務邏輯層的需要,它也為供應商提供了更好的靈活性,為了滿足這些模闆,輕量級EJB提供了以下功能:

  1、有狀态,無狀态和單元素集合會話Bean;

  2、本地EJB接口或無接口;

  3、攔截器;

  4、容器管理的和Bean管理的事務;

  5、聲明和程式設計安全;

  6、嵌入式API。

  更多EJB 3.1新特性

  EJB 3.1除前面談到的這些新特性外,還帶來了更多的新特性和改進,例如,它包括一個用于Java SE環境的嵌入式API和容器,這些特性使在Java EE容器外(通常指Java SE環境)測試EJB 元件更容易,另外,EJB 3.1引入的單元素集合為EJB應用程式提供了一個友善的方法,在應用程式初始化或關閉期間接受回報,預設情況下,由容器決定何時執行個體化單元素集合執行個體,但你可以通過@Startup注解,強制容器在應用程式初始化期間執行個體化單元素集合執行個體,允許Bean定義一個@PostConstruct方法保證在應用程式啟動時調用,此外,@PreDestroy方法可以保證應用程式關閉時調用。