我的同事說我使用本地EJB是不是好主意
我和那強烈反對。 本地EJB是非常好主意,因爲它們是bean的實現業務邏輯的理想型。目前的EJB bean的重量非常輕,所以你不必避免它們,因爲任何涉嫌重量級。
這些類型的bean的最大優點是可能是他們的自動交易管理,做任何類型的數據庫工作時會派上大用途。
這不只是企業應用程序需要訪問JMS隊列和複雜的EIS系統。任何一次執行多個寫入數據庫的Web應用程序都會從中受益。如果沒有事務處理,最終會發生一個User
,只要發生異常或崩潰,數據庫中只有一半持續存在。如果沒有EJB,則必須使用大量非常詳細的start\commit\rollback
語句來拋棄代碼,更不用說將事務(通常通過「連接」)傳播到所有代碼中,並且對於事務處於或未處於活動狀態時有單獨的情況。
對於EJB bean,所有這些複雜性都會消失。這就像垃圾收集與手動內存管理。
即使是最簡單的Web應用程序也可以使用其他許多有趣的功能,例如聲明性角色檢查(@RolesAllowed
),bean的聯合(以節制吞吐量等)和線程安全性。
在Java EE 6的他們變得更容易使用簡單的Web應用程序,在那裏,他們可以在.war到處出現(沒有單獨的.jar和.EAR不再需要傘)。
所以我很困惑:何時使用GWT Servlet(它比簡單的HTTPServlet更方便,它提供了RPC風格的方法調用)以及何時使用EJB?
所以現在我們談論的是遠程EJB。在這種情況下,答案是不同的。
如果客戶端從互聯網連接,則幾乎不會使用遠程EJB。通常需要打開大量端口,包括客戶端上的端口。
同樣的,如果你有異構客戶端(.NET,C++和運行略有不同版本的AS遠程EJB使用的甚至是Java客戶端),你通常不會使用遠程EJB的。儘管理論上支持Corba(IIOP)並因此允許不同類型的客戶端,實際上遠程EJB通信僅在客戶端和服務器都運行Java並且除了相同的AS(應用服務器)或者其中之一是具有用於遠程服務器的客戶端庫的Java SE客戶端(其可以是巨大的)。
這是一個有點尷尬的遠程技術,但EJB規範甚至沒有規定如何建立在首位的遠程連接。事實上的標準是遠程JNDI,但由於這不是規範,JBoss例如希望在JBoss AS 7中停止支持這一點。
在所有這些情況下,您將使用Web Service
技術而不是遠程EJB。 GWT Servlet
可能是一個選項,但在這裏並不是真正的典型例子。除非您已經在使用GWT,否則我不建議僅爲從任意(非GWT)客戶端的Web/rpc連接安裝它。
一般Java解決方案是JAX-WS和JAX-RS,它們是SOAP resp REST實現(都可以與EJB btw結合使用)。衆所周知的JAX-RS實現是Jersey(example)和RestEasy。在Java EE 6中,你不必爲它們安裝任何東西,因爲它們已經是平臺的一部分。對於Java EE 5,您必須單獨安裝JAX-RS,但JAX-WS已經在那裏。儘管JAX-WS具有更多的內置類型安全特性(這也正是其大部分複雜性來自其中的部分),但人們通常會發現JAX-RS更易於入門,也更加現代化。
最後,當做我們使用遠程EJB?通常,您可以在運行相同AS的本地網絡上的應用程序之間進行通信。在這種情況下,有潛在的性能優勢(二進制序列化可以比json/xml轉換來得快),並且有一些強大的選項可用於傳播安全上下文和協調分佈式事務。簡單的網絡應用程序很可能不會經常需要最後一個功能。
一個常見的模式是JAX-RS資源(bean)接受來自遠程(Web)客戶端的請求,然後委託工作到包含實際業務邏輯的本地EJB。
[This might help](http://stackoverflow.com/questions/2013793/web-services-vs-ejb-vs-rmi-advantages-and-disadvantages)。 – betomontejo