我在远程服务器上有一个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)
答案 0 :(得分:1)
我最近在电信公司遇到过与此类似的情况,但在Weblogic上,目前我无法为您的确切问题编写POC。
回答原始问题
让EJB存根文件保证从任何服务器成功访问EJB方法吗?
EJB存根本身并不是任何保证。它基本上是一个实现所需接口的代理对象。它的职责是序列化和反序列化对象,并使用字节流调用RMI服务器并尝试为您映射响应。
如果有任何限制,可能是什么?
问题可能在很大范围内出现。我遇到的最新时间是上述Weblogic中的内部实现更改。在身份验证期间,抛出了NullPointerException
。所有这些都是因为在Weblogic实例中他们使用了未设置的密码,但是使用之前的版本它运行良好。解决方案是在String
(InitialContext
)中添加一个空的Context.CREDENTIALS
参数。
同样重要的是要考虑网络开销,因为现在两台服务器位于不同的机器上等。
在目前的大多数情况下,存根是在运行时生成的,因此不需要静态创建(例如使用rmic
)。
其他堆栈跟踪
很难说出你的问题究竟是什么(应该有更多的日志来确定),但我怀疑在我们的案例中存在类似的问题。如果您可以尝试,请在前面的日志中添加更多内容并尝试向上下文添加更多属性。