【问题标题】:Where and how is the EJB3 method hash calculated?EJB3 方法哈希在哪里以及如何计算?
【发布时间】:2011-06-20 09:50:45
【问题描述】:

我有两个 Tomcat 6 实例,它们都调用远程 JBoss 5 服务器上的 EJB。

在两个 Tomcat 上部署相同的客户端代码后,当一个调用 EJB 方法时,我会从应用程序服务器得到一个 NullPointerException,而在另一个它工作正常。

使用调试器查看代码,似乎被调用的方法的哈希码在两次调用之间是不同的,尽管我认为它应该是相同的。由于哈希码不同,在org.jboss.ejb3.service.ServiceContainer 中找不到远程方法。

什么可能导致两次调用之间的哈希码不同?有关信息,工作的 Tomcat 与 JBoss 服务器在同一台机器上,而失败的 Tomcat 必须通过网络连接到 JBoss。两个Tomcat的连接配置是一样的。


解决方案是在 Tomcat 的 lib 目录中存在 jboss-aspect-jdk50-client_4.2.2.jar - 删除此文件可使应用程序正常工作。

我仍然不明白为什么这在本地 Tomcat 实例上有效,但在远程无效。我假设类加载顺序有所不同,或者更可能的是,通信是远程的这一事实导致使用了不同的策略。

我暂时保留这个问题,以防有人可以对最后一点提供解释。

【问题讨论】:

    标签: ejb-3.0 tomcat6 jboss5.x


    【解决方案1】:

    很奇怪。是否所有三台服务器都使用相同版本的代码运行?

    【讨论】:

    • Tomcat 是如何连接到 JBoss 的?普通的旧 RMI? Tomcat 中的某种 EJB3 客户端容器?
    • 从现有的罐子来看(我不负责代码,我只是最后的手段:))它使用 JBoss 5 客户端库连接到 jnp:// URL - 4.2.2 jar 是一个流浪者。
    • 对于本地 EJB3,JBoss 使用 Javassist 生成必要的代理。它也可能对远程 EJB3 执行此操作(而不是使用普通 RMI 存根)。 JBossAOP 也使用 Javassist,所以流氓 jar 可能会以某种方式拖入一些不合适的 Javassist 版本,这会产生带有 duff 方法哈希的代理。不过,这纯粹是猜测。
    猜你喜欢
    • 2016-06-23
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    相关资源
    最近更新 更多