我有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();
用例/结果:
- 当 Ejb-B与Ejb -A 不在同一台服务器上时,一切正常。(它通过 URL 循环)
- 当 Ejb-B确实存在于同一台服务器上,并且 Ejb-A 恰好在同一台服务器上调用 Ejb-B 时,一切正常。
- 当 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