2014-02-20 17 views
3

是否有可能創建訪問一個EJB3豆,用具有上的供應商JAR或配置不依賴所述客戶端的客戶端?我們目前需要支持將服務部署在WebSphere或JBoss服務器上,並將客戶端部署爲WAS或JBoss上的應用程序或作爲獨立應用程序運行的場景。創建一個廠商中立EJB3客戶

我曾經是能夠做到這與EJB2.x豆,我只需要創建一個使用RMIC存根。

但隨着EJB3,如果我連接到WebSphere我必須包括瘦客戶機JAR文件,再加上我有使用WAS工具來預先生成的存根。對於JBoss,我必須使用jboss-client.jar。

+0

我會考慮使用ws over ejb進行遠程調用 –

+0

是的,我也考慮過這個問題,但我們已經深入EJB領域。加上我們不能失去使用RMI的性能提升。 – Renan

+0

從我的期滿表現差異可以忽略不計。我想你也可以使用jax-rs和java序列化,如果你擔心jax-ws的性能 –

回答

3

不,這是不可能的。這已經作出了明確的EJB 3.2規範的第10節:

本章描述用於通過從分佈在網絡上的客戶端 的EJB 2.1遠程客戶端視圖訪問一個 企業bean的互用性的支持,以及分佈式互操作性 對來自遠程客戶端 企業bean的調用的要求是Java平臺企業版(Java EE)組件。 沒有爲EJB 3.x遠程客戶端視圖定義分佈式互操作性。

還要注意部分10.5.5:

系統值類是實施 javax.ejb.Handle,javax.ejb.HomeHandle,javax.ejb.EJBMetaData, 的Java序列化值類.util.Enumeration,java.util.Collection和java.util.Iterator 接口。這些值類由EJB容器供應商 提供。它們必須以託管被引用bean的容器的 容器以JAR文件的形式提供。對於互操作性場景,如果引用組件在 運行時使用此類系統值類,則部署人員必須確保引用組件提供的引用組的容器提供的這些系統值類 可用於 。這可以被完成,例如,通過包括 在引用 容器的類路徑這些系統值類,或由它們提供給 部署工具部署系統值類與 引用組件的應用。

對於WebSphere Application Server,EJB瘦客戶機包含這些系統值類以及使用CosNaming的IBM JNDI實現。理論上,如果不需要系統值類,則不需要此瘦客戶機,而您的客戶機JVM具有自己的具有CosNaming實現的ORB。

+0

我正在使用SUN CosNaming類,但我一直試圖使它工作,但我正遇到'不匹配的序列化'問題,這可能意味着WAS系統值類與SUN系統值類不匹配 – Renan

+0

如果您可以提供特定的異常消息/堆棧(可能需要更新問題描述或創建另一個問題),我可以仔細研究一下,也許客戶端和服務器的參數/返回/異常的值類是不同的?如果不是,可能t這是Sun/Oracle或WAS代碼中的互操作錯誤。 –

2

簡短的回答:不,這是不可能的,因爲客戶端需要三樣東西:

  • 的接口類。
  • 服務器AS的客戶端庫(是的,不幸的)
  • 告訴客戶端服務器地址/ JNDI查找路徑(QA,PROD等)

的配置如果您的客戶端上運行同樣的產品(比方說JBoss到JBoss的通信),你不需要客戶端庫,只需要進行遠程查詢。如果您有多個客戶端/服務器應用程序服務器,這會使事情變得複雜,因爲您將不得不在另一臺服務器產品中運行一個產品的客戶端庫。

說起運行作爲客戶端獨立的應用程序,我只希望建立和提供包含不僅接口類,而且兩臺服務器的客戶端庫1個客戶端jar/lib目錄下。然後提供一個小的幫助類,它返回根據客戶端配置中的標誌創建並基於JBoss或Websphere的正確InitialContext。

我知道這最後的想法是不乾淨的解決方案,但甚至可能在不同的產品的運行的「客戶」的工作。

+1

我們實際上已經擁有了1個擁有充當網關類的重客戶端JAR。我們現在關注的是WAS瘦客戶端JAR相對較大(總共17MB)。由於授權問題,我們不允許將jboss-client.jar與我們的產品捆綁在一起。 – Renan

+0

您好,現在處於一個非常糟糕的境地:(除了發生許可問題之外,想象一下在正在運行的WebSphere應用程序中有一個JBoss客戶端jar作爲需求,當然也可以查找本地EJBs,這肯定可以通過編碼查找並封裝遠程調用,儘管你距離性感的HelloWorld示例如此之遙,它們只是使用EJB/Inject註釋,並且在JEE教程中閃耀如此之好:( –