我在远程服务器上有一个 EJB (EJB 2x)。我有一个 stub 文件,我在客户端上使用它来访问 EJB 方法。
我的客户端在另一台主机上运行。它曾经在与它调用的 EJB 完全相同的服务器下运行。但现在我已经将客户端部署到来自不同供应商的服务器,并且现在调用 EJB 方法会引发 CORBA 异常。
拥有 EJB stub 文件是否可以保证从任何服务器成功访问 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)
最佳答案
我最近在一家电信公司遇到了类似的情况,但在 Weblogic 上,目前我无法为您的确切问题编写 POC。
原始问题的答案
Does having the EJB stub file guarantee a successful access to EJB methods from any server?
EJB stub 本身并不能保证任何事情。它基本上是一个实现所需接口(interface)的代理对象。它的职责是序列化和反序列化对象并使用字节流调用 RMI 服务器并尝试为您映射响应。
If there can be any limitations, what they could be?
问题可能会在很广泛的范围内出现。我最近一次遇到的是上述 Weblogic 中的内部实现更改。在身份验证期间,抛出了 NullPointerException
。这一切都是因为在 Weblogic 实例中他们使用了未设置的密码,但在以前的版本中它运行良好。解决方案是在 InitialContext
(Context.CREDENTIALS
) 中添加一个空的 String
参数。
考虑网络开销也很重要,因为现在两台服务器位于不同的机器上等等。
在现在的大多数情况下, stub 是在运行时生成的,因此不需要静态创建它们(例如使用 rmic
)。
额外的堆栈跟踪
很难说出您的问题到底是什么(应该有更多的日志可以确定),但我怀疑与我们的案例中的问题类似。包括更多来自日志的内容,并尝试向上下文添加更多属性(如果可以的话)。
关于jakarta-ee - EJB stub 是否保证远程 EJB 可用于任何客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44398019/