【问题标题】:Create a vendor-neutral EJB3 client创建供应商中立的 EJB3 客户端
【发布时间】:2014-02-20 07:51:57
【问题描述】:

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

我以前可以使用 EJB2.x bean 来做到这一点,我只需要使用 RMIC 创建存根。

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

【问题讨论】:

  • 我会考虑使用 ws 而不是 ejb 进行远程调用
  • 是的,我也想过这个问题,但我们已经在 EJB 中处于领先地位。此外,我们不能失去使用 RMI 获得的性能提升。
  • 从我的过期时间来看,性能差异可以忽略不计。如果您担心 jax-ws 的性能,我想您也可以使用 jax-rs 和 java 序列化
  • 我们正在发送非常大的对象。我们的测试显示使用 XML 的普通 servlet 调用的速度提高了近 50%。
  • 然后试试jax-rs和java对象序列化,应该和rmi一样快。顺便说一句,你为什么在 jax-ws 服务上使用 servlet + xml(servlet + xml 组合很难获得正确的性能,尤其是如果你使用 jaxb 进行编组/解组)

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


【解决方案1】:

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

本章描述了访问一个互操作性支持 企业 bean 通过 EJB 2.1 远程客户端视图从客户端 分布在网络上,以及分布式互操作性 从远程客户端调用企业 bean 的要求 是 Java Platform, Enterprise Edition (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 的容器。对于互操作场景, 如果引用组件将在 运行时,部署者必须确保这些系统值类 由托管引用 bean 的容器提供 引用组件。例如,这可以通过包括 引用的类路径中的这些系统值类 容器,或者通过部署系统值类 引用组件的应用程序,将它们提供给 部署工具。

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

【讨论】:

  • 我正在使用 SUN CosNaming 类。我一直在努力让它工作,但我遇到了“不匹配的序列化”问题。这可能意味着 WAS 系统值类与 SUN 系统值类不匹配。
  • 如果你能提供具体的异常消息/堆栈(也许更新问题描述或创建另一个问题),我可以尝试仔细看看。也许参数/返回/异常的值类在客户端和服务器之间是不同的?如果没有,可能 Sun/Oracle 或 WAS 代码中存在互操作错误。
【解决方案2】:

简短回答:不,这是不可能的,因为客户需要三样东西:

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

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

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

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

【讨论】:

  • 我们实际上已经有 1 个重型客户端 JAR,它具有充当网关的类。我们现在担心的是 WAS 瘦客户端 JAR 相对较大(总共 17MB)。而且由于许可问题,我们不允许将 jboss-client.jar 与我们的产品捆绑在一起。
  • 先生,您的处境很糟糕:(除了许可问题之外,想象一下在运行的 WebSphere 应用程序中需要一个 JBoss 客户端 jar,这当然也会查找本地 EJB。这肯定是可能的使用编码查找并封装远程调用,尽管您与性感的 HelloWorld 示例相距甚远,这些示例仅使用 EJB / Inject 注释并在 JEE 教程中表现出色:(
猜你喜欢
  • 2011-03-27
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
相关资源
最近更新 更多