1

我有2个ejb。Ejb-A 调用 Ejb-B。他们不在同一个耳朵里。

为了可移植性,Ejb-B 可能存在也可能不存在于同一台服务器上。(有一个外部属性文件具有 Ejb-B 的提供程序 URL。我无法控制它。)

示例代码:在 Ejb-A 中

EjbBDelegate delegateB = EjbBDelegateHelper.getRemoteDelegate(); // lookup from list of URLs from props... 
BookOfMagic bom = delegateB.getSomethingInteresting();

用例/结果

  1. 当 Ejb-B与Ejb -A 不在同一台服务器上时,一切正常。(它通过 URL 循环)
  2. 当 Ejb-B确实存在于同一台服务器上,并且 Ejb-A 恰好在同一台服务器上调用 Ejb-B 时,一切正常。
  3. 当 Ejb-B同一台服务器上存在,并且 Ejb-A 在另一台服务器上调用 Ejb-B 时,我得到:

javax.ejb.EJBException:嵌套异常是:java.lang.ClassCastException:$Proxy126 java.lang.ClassCastException:$Proxy126

我正在使用 Weblogic 10.0、Java 5、EJB3

基本上,如果服务器上存在 Ejb-B,则必须仅在该服务器上调用它。

这使我相信该类正在由本地类加载器(在部署时?)加载,然后在远程调用时,另一个类加载器正在加载它。(导致异常)但它应该可以工作,因为它应该被序列化到目标类加载器中......

我究竟做错了什么??

此外,在本地复制时,Ejb-A 会偏爱同一服务器上的 Ejb-B,因此很难复制。但在其他机器上并非如此。

注意:这一切都适用于 EJB2

4

1 回答 1

1

所以我能够通过向bean添加@RemoteHome(MyRemoteHome.class)来“解决”这个问题

public interface MyRemoteMethods {
    String myMethod() throws RemoteException; // this Ex is required
}

public interface MyRemote extends EJBObject, MyRemoteMethods { 
}

public interface MyRemoteHome extends EJBHome {
    public MyRemote create() throws CreateException, RemoteException;
}

然后我的豆子

...
@RemoteHome(MyRemoteHome.class)
public class MyBean implements MyRemoteMethods {
...

以前,只存在 bean 和 Remote 接口。(没有本地使用)

总的来说,这个修复使我的 EJB 3 更像 EJB 2 并且不那么干净(涉及更多的代码和类)。我也不清楚为什么我可以从我的本地和远程服务器对 RemoteHome 接口(并调用 create)进行 jndi 查找,而不会得到 ClassCastException,但是当我为 Remote 接口执行此操作时,我确实得到了 ClassCastException。这是 Weblogic 中的错误吗?(我也看过一些类似使用 JBoss 的帖子)

于 2010-06-22T18:30:01.547 回答