EJB存根是否保证远程EJB适用于任何客户端?

3
我有一个位于远程服务器上的EJB(EJB 2x)。我有一个存根文件,用于在客户端上访问EJB方法。
我的客户端运行在另一台主机上。它曾经在与调用的EJB完全相同的服务器下运行。但现在,我已将客户端部署到来自不同供应商的服务器上,并且调用EJB方法会抛出CORBA异常。
拥有EJB存根文件是否保证可以从任何服务器成功访问EJB方法?如果存在任何限制,它们可能是什么?
我尝试调试异常,但它发生在CORBA传输中的某个地方,对于我的特定客户端,这是yoko,我无法获得任何有意义的信息。
我拥有的堆栈跟踪:
org.omg.CORBA.portable.UnknownException: originalEx: org.omg.CORBA.MARSHAL: encountered null wchar in wstring:  vmcid: Apache minor code: 0x15  completed: No:  vmcid: 0x0 minor code: 0x0  completed: Maybe
    at org.apache.yoko.rmi.impl.ValueDescriptor.readSerializable(ValueDescriptor.java:747)
    at org.apache.yoko.rmi.impl.ValueDescriptor.readValue(ValueDescriptor.java:726)
    at org.apache.yoko.rmi.impl.ValueDescriptor.readValue(ValueDescriptor.java:584)
    at org.apache.yoko.rmi.impl.ValueHandlerImpl.readValue0(ValueHandlerImpl.java:114)

不确定发生了什么,如果没有你得到的CORBA异常的详细信息和一些日志输出,可能没有人能在这里帮助你。 - Johnny Willemsen
我只是在询问这种问题是否可能存在,以及原因是什么。从您的评论中,我了解到这是可能的,由于CORBA实现的差异(我认为WS完整配置文件与Liberty的实现不同)。除非有更详细的答案(不太可能),否则我可以接受您的评论作为答案。非常感谢您的帮助。 - Alexander Kulyakhtin
可能有不同的原因,关于您收到的CORBA异常的任何信息,都有一组异常,每个异常都有不同的含义。 - Johnny Willemsen
对于每个产品,您都必须基于您的IDL生成自己的存根。当您更改客户端时,必须使用您的IDL重新生成客户端的存根。生成的存根包含客户端代码和ORB实现之间的粘合代码,它是供应商特定的,可能会随版本更新而更改。 - Johnny Willemsen
那么,如果客户端移动到另一个服务器,现有的存根 jar 文件可能无法工作?由于我没有该 EJB 的源代码,因此无法自行重新生成它?来自 IBM 的那个人似乎说 jar 文件可能保持不变。 - Alexander Kulyakhtin
显示剩余7条评论
1个回答

1
我最近在电信公司遇到了类似的情况,但是在Weblogic上,目前我无法为您的确切问题编写POC。
原始问题的回答
EJB存根文件是否保证从任何服务器成功访问EJB方法?
EJB存根本身并不能保证任何事情。它基本上是实现所需接口的代理对象。它的职责是序列化和反序列化对象,并使用字节流调用RMI服务器,并尝试为您映射响应。
如果有任何限制,它们可能是什么?
问题可能会出现在广泛的范围内。我最近遇到的一个问题是在提到的Weblogic中进行的内部实现更改。在认证期间,抛出了NullPointerException。这是因为Weblogic实例内部使用了未设置的密码,但在以前的版本中它一直运行良好。解决方案是在InitialContext(Context.CREDENTIALS)中添加一个空字符串参数。
此外,考虑网络开销也很重要,因为两个服务器现在在不同的机器上等等。
在大多数情况下,存根现在是在运行时生成的,因此无需静态地创建这些存根(例如使用rmic)。
额外的堆栈跟踪
很难确定您的问题可能是什么(应该有更多日志来确定),但我怀疑与我们的情况类似的问题。 如果可以,请包含更多日志内容,并尝试向上下文中添加更多属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接