创建供应商中立的EJB3客户端

时间:2014-02-20 07:51:58

标签: java java-ee jboss7.x ejb-3.0 websphere-7

是否可以创建访问EJB3 bean的客户端,客户端不依赖于供应商JAR或配置?我们目前需要支持在WebSphere或JBoss服务器上部署我们的服务的场景,并且客户端在WAS或JBoss上作为应用程序部署,或者作为独立应用程序运行。

我曾经能够使用EJB2.x bean做到这一点,我只需要使用RMIC创建存根。

但是使用EJB3,如果我要连接到WebSphere,我必须包含瘦客户端JAR,而且我必须使用WAS工具预生成存根。对于JBoss,我必须使用jboss-client.jar。

2 个答案:

答案 0 :(得分:3)

不,这是不可能的。这已在EJB 3.2规范的第10节中明确说明:

  

本章介绍了访问的互操作性支持   企业bean通过EJB 2.1远程客户端从客户端查看   分布在网络上,以及分布式互操作性   从远程客户端调用企业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容器提供   供应商。它们必须以JAR文件的形式提供   托管引用bean的容器。对于互操作性方案,   如果引用组件将使用此类系统值类   运行时,Deployer必须确保这些系统值类   由托管引用bean的容器提供的可用   引用组件。这可以通过例如包括来完成   这些系统值类在引用的类路径中   容器,或通过部署系统值类   通过提供组件的应用程序来引用组件的应用程序   部署工具。

对于WebSphere Application Server,EJB瘦客户端包含这些系统值类以及使用CosNaming的IBM JNDI实现。理论上,如果您不需要系统值类,并且您的客户端JVM具有自己的带有CosNaming实现的ORB,则不需要此瘦客户端。

答案 1 :(得分:2)

简短回答:不,这是不可能的,因为客户需要三件事:

  • 接口类。
  • 服务器AS的客户端库(是的,遗憾的是)
  • 告诉客户端服务器地址/ jndi查找路径(qa,prod等)的配置

如果您的客户端运行在同一产品上(假设JBoss与JBoss通信),您将不需要客户端库,只能进行远程查找。如果您混合使用客户端/服务器应用程序服务器,这将使事情变得复杂,因为您必须在另一个服务器产品中运行一个产品的客户端库。

说到作为客户端运行的独立应用程序,我只构建并提供1个重型客户端jar / lib,不仅包含接口类,还包含两个服务器的客户端库。然后提供一个小助手类,它返回正确的InitialContext创建并基于JBoss或Websphere,具体取决于客户端配置中的标志。

我知道这最后一个想法不是一个干净的解决方案,尽管甚至可能在作为“客户端”运行的不同AS产品中工作。