2012-09-18 16 views
5

我的同事說我使用本地EJB並不是好主意,因爲他們作爲內包裝JAR類(即當EJB只用作local他們沒有在正常上課有什麼優勢)。只有當某些代碼可能被多個應用程序使用時,我才必須使用EJB。但是我讀到了EJB的更多優點(安全性,線程安全性,trasanctions等)。當喜歡在EJB的Servlet GWT

所以我很困惑:何時使用GWT Servlet(它比簡單的HTTPServlet更方便,它提供了RPC風格的方法調用)以及何時使用EJB?

P.S.我沒有使用JPA 2.0,CDI等任何期貨(因爲我只能在WAS 7上使用Java EE 5)。

+0

[This might help](http://stackoverflow.com/questions/2013793/web-services-vs-ejb-vs-rmi-advantages-and-disadvantages)。 – betomontejo

回答

9

我的同事說我使用本地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實現是Jerseyexample)和RestEasy。在Java EE 6中,你不必爲它們安裝任何東西,因爲它們已經是平臺的一部分。對於Java EE 5,您必須單獨安裝JAX-RS,但JAX-WS已經在那裏。儘管JAX-WS具有更多的內置類型安全特性(這也正是其大部分複雜性來自其中的部分),但人們通常會發現JAX-RS更易於入門,也更加現代化。

最後,當我們使用遠程EJB?通常,您可以在運行相同AS的本地網絡上的應用程序之間進行通信。在這種情況下,有潛在的性能優勢(二進制序列化可以比json/xml轉換來得快),並且有一些強大的選項可用於傳播安全上下文和協調分佈式事務。簡單的網絡應用程序很可能不會經常需要最後一個功能。

一個常見的模式是JAX-RS資源(bean)接受來自遠程(Web)客戶端的請求,然後委託工作到包含實際業務邏輯的本地EJB。

+0

偉大的信息... – Jmoney38

0

它取決於你的應用程序/項目需求範圍。 EJB用於支持Java EE功能。它不包括在您的項目範圍內。不要使用它。 Java EE Features

+0

您在Java EE特性下的含義是什麼?我想我可以在不使用EJB的情況下使用JPA,REST,SOAP,CDI等。那麼何時使用EJB? – MyTitle

+0

是的,你可以在不使用EJB的情況下使用它們。但是,您必須手動控制事務(Bean管理事務)。如何彈簧? – CycDemo

+0

'如何彈簧?'不在當前工作中) – MyTitle

1

EJB是在其自己的容器後端使用的技術,並給出了類似的交易安全等一些特性是透明的開發商。

從Java EE教程:

您應該考慮使用企業bean,如果你的應用有以下要求任何 :

應用程序必須是可擴展的。爲了適應越來越多的 用戶,您可能需要在多臺機器上分發應用程序的組件。應用程序 的企業bean不僅可以在不同的機器上運行,而且它們的位置對於客戶端而言仍然是 。

事務必須確保數據的完整性。 Enterprise beans支持 事務,這是管理共享對象的併發訪問的機制。

的應用程序將有不同的客戶的。只需要幾行代碼 ,遠程客戶端就可以輕鬆找到企業bean。這些客戶端可以很薄,種類繁多。

現在,當您只在單個Web服務器上進行Web開發時,EJB並不會真正幫助您,並且還有其他更簡單的選項,例如GWT Servlet。

但是,如果你想使用管理的事務,連接到JMS隊列或者在後臺做一些批處理然後EJB來打。

例如,您得到一份訂單,您需要與不同部門進行溝通以履行訂單。在這種情況下,您需要一個後臺流程來完成工作,而前端通知客戶訂單正在準備中。 servlet可以將訂單發送到一個隊列中,在這個隊列中,一個消息驅動bean可以將其選中並通過調用其他EJB來進行一些處理。