【问题标题】:Remote EJB call from different JRE and Server version来自不同 JRE 和服务器版本的远程 EJB 调用
【发布时间】:2014-11-10 10:48:28
【问题描述】:

在我的工作中,我遇到了这样一种情况,正确的理论架构解决方案是从运行在 JRE 1.8 上的 Wildfly 8.1 (Java EE 7) 实例调用部署在运行在 JRE 1.6 上的 JBoss 4.3 (Java EE 5) 上的 EJB .

这可能吗?我会遇到什么问题?

问题是关于兼容性的

  • 应用服务器
  • 运行时
  • 规范和标准

我知道有使用 Web 服务的解决方法。如果可能,请附上兼容性表或其他资源的链接。

【问题讨论】:

  • 我们尝试从 Weblogic (Java 1.6) 上的客户端调用 JBOSS EAP 7 (Java 1.8) 上的服务器。不幸的是,它不适用于 EAP 7,但显然 EAP 6.4 可以做到(但由于这已经超出了主流支持,因此不是一个好的选择)。根据 Arjan 的回答,挑战在于客户端类。

标签: jakarta-ee jboss ejb compatibility wildfly


【解决方案1】:

不幸的是,在应用程序服务器之间调用 EJB 的能力被非常糟糕地指定(阅读,根本没有)。

问题在于,为了调用远程 EJB,您需要一个客户端库。此客户端库包含许多类,这些类通常是应用程序服务器的一部分。这在客户端是 Java SE 应用程序时完美运行,但当客户端是另一个 Java EE 应用程序服务器时会导致重大问题(因为那时许多类发生冲突)。

唯一的例外是两个应用程序服务器的品牌和版本完全相同,因为那时根本不需要客户端库。

因此,一般来说,您尝试做的事情已经不起作用,但是由于您使用的是 JBoss,所以它绝对不起作用。 JBoss 在能够从其他版本的 JBoss 调用 EJB 方面是出了名的糟糕。关于这个问题已经写了很多,并且已经进行了很多尝试来解决它,但据我所知,它从未真正奏效。

理论上,这在很久以前就可以在 EJB 规范中得到解决,但是 EJB 或多或少已经被淘汰(使用其他规范重新实现了它的功能),所以可以理解的是,这里几乎没有动力来解决任何问题。

【讨论】:

    【解决方案2】:

    您提到了 JRE 版本,但没有提到用于编译服务和​​客户端代码的 JDK 版本。

    一般来说,较高的 JRE 版本可以运行任何使用较低或类似 JDK 版本的编译代码。使用客户端存根进行代码间通信的相同规则。较高版本可以调用较低版本,而相反是不可能的。因此,如果生成的客户端存根使用的是 JDK1.7 或 1.8,则无法使用 JRE1.6 调用它,您将收到此错误 java.lang.UnsupportedClassVersionError: Bad version ...

    所以,只要你在JDK1.6中编译代码就没有问题

    【讨论】:

      【解决方案3】:

      This Stackoverflow answer 声称 Wildfly 可以在 JBoss 5 中调用 EJB,因此希望这也适用于 JBoss 4。祝你好运!

      【讨论】:

        猜你喜欢
        • 2016-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-16
        • 2013-10-14
        • 1970-01-01
        相关资源
        最近更新 更多