是否可以创建访问EJB3 bean的客户端,客户端不依赖于供应商JAR或配置?我们目前需要支持在WebSphere或JBoss服务器上部署我们的服务的场景,并且客户端在WAS或JBoss上作为应用程序部署,或者作为独立应用程序运行。
我曾经能够使用EJB2.x bean做到这一点,我只需要使用RMIC创建存根。
但是使用EJB3,如果我要连接到WebSphere,我必须包含瘦客户端JAR,而且我必须使用WAS工具预生成存根。对于JBoss,我必须使用jboss-client.jar。
答案 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)
简短回答:不,这是不可能的,因为客户需要三件事:
如果您的客户端运行在同一产品上(假设JBoss与JBoss通信),您将不需要客户端库,只能进行远程查找。如果您混合使用客户端/服务器应用程序服务器,这将使事情变得复杂,因为您必须在另一个服务器产品中运行一个产品的客户端库。
说到作为客户端运行的独立应用程序,我只构建并提供1个重型客户端jar / lib,不仅包含接口类,还包含两个服务器的客户端库。然后提供一个小助手类,它返回正确的InitialContext创建并基于JBoss或Websphere,具体取决于客户端配置中的标志。
我知道这最后一个想法不是一个干净的解决方案,尽管甚至可能在作为“客户端”运行的不同AS产品中工作。