我需要使用远程ejb调用的帮助。有以下设置:
背景:
一个JavaEE Web应用程序(将其命名为 app1 )托管在一个老式的 WAS8应用程序服务器上。该应用程序至少提供一个(已知的)远程ejb以便应用程序与应用程序进行通信。
另一个JavaEE Web应用程序(将其命名为 app2 )托管在 websphere自由服务器上。 (我们目前正在将该应用程序从WAS8迁移到Websphere自由。)现在,该应用程序(app2)必须访问app1提供的远程ejb。
问题:
远程ejb调用的旧实现并不符合Websphere自由。我做了很多研究,并能够迁移远程ejb呼叫。看起来像这样:
try {
// Holds the server address
String server = "server.address:port";
// Building JNDI address:
// E.g. corbaname:iiop:server:port/java:global/app1/ejb-module/BeanImpl!qualified.name.of.RemoteBean
StringBuilder address = new StringBuilder("corbaname:iiop:") // Protocol
.append(server) // Server address
.append("/") // Separator
.append("java:") // EJB context
.append("global/") // Globales Repository
.append("app1/") // Applikation
.append("ejb-module/") // module
.append("BeanImpl!") // Bean
.append("qualified.name.of.RemoteBean"); // Remote Interface
// Performing jndi lookup (shadowed remote ejb call by context (liberty server))
Object o = InitialContext.doLookup(address.toString());
// Casting requested object
service = (qualified.name.of.RemoteBean) PortableRemoteObject.narrow(o,
qualified.name.of.RemoteBean.class);
} catch (NamingException e) {
// Catching naming errors
log.warn("Cannot read app1 URL from JNDI: {}.", e.getMessage());
log.error("Exeption: ", e);
} catch (SystemException e) {
// Catching any other error
log.warn("Cannot connect to app1: {}", e.getMessage());
log.error("Exeption: ", e);
}
此代码可以编译并且可以执行,没有任何命名异常。
我仍然无法成功请求任何远程ejb对象。在每个请求中,以下堆栈跟踪都会发生org.omg.CORBA.OBJ_ADAPTER
异常(错误消息:org.omg.CORBA.OBJ_ADAPTER: : vmcid: 0x4942f000 minor code: 0xb81 completed: No
):
Exeption: org.omg.CORBA.OBJ_ADAPTER:
at org.apache.yoko.orb.OB.Util.unmarshalSystemException(Util.java:165)
at org.apache.yoko.orb.OB.GIOPConnection.processReply(GIOPConnection.java:543)
at org.apache.yoko.orb.OB.GIOPConnection.processMessage(GIOPConnection.java:365)
at org.apache.yoko.orb.OB.GIOPConnectionThreaded.execReceive(GIOPConnectionThreaded.java:429)
at org.apache.yoko.orb.OB.GIOPConnectionThreaded.access$200(GIOPConnectionThreaded.java:42)
at org.apache.yoko.orb.OB.GIOPConnectionThreaded$Receiver.run(GIOPConnectionThreaded.java:68)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
我不知道那里发生了什么。我猜请求VM(Oracle Java 8)无法从响应中读取对象(从带有Java 6的IBM J9 VM发送)
基础结构信息:
WAS8在Java公司的内部网中托管的Linux服务器上与Java版本1.6.0的IBM J9 VM
一起运行。 WAS8是8.0.0.15 ND版本。
websphere自由正在Windows 10机器上以Java版本1.8.0_172-b11的Java HotSpot(TM) 64-Bit Server VM
运行,该机器通过VPN连接到与WAS8应用程序服务器相同的网络区域。自由版本是18.0.0.2
问题:
JNDI地址正确吗?远程ejb的绑定如下(来自服务器启动日志):
[1/11/19 13:26:21:230 CET] 00000008 EJBContainerI I CNTR0167I: The server is binding the qualified.name.of.RemoteBeaninterface of the BeanImplenterprise bean in the ejb-module.jar module of the app1 application. The binding location is: BeanImpl
[1/11/19 13:26:21:246 CET] 00000008 AbstractEJBRu I CNTR0167I: The server is binding the qualified.name.of.RemoteBeaninterface of the BeanImplenterprise bean in the ejb-module.jar module of the app1 application. The binding location is: java:global/app1/ejb-module/BeanImpl!qualified.name.of.RemoteBeaninterface
是否可以从其他供应商(通常是不同版本)的其他jvm调用远程ejb?
是否有关于WAS8的NameService的任何文档?
答案 0 :(得分:0)
DeveloperWorks中类似的thread讨论了Liberty客户端在tWAS中调用EJB的问题。当时,有人质疑Liberty是否具有此功能。此后已实施RFE 32815。 Liberty文档显示了EJB查找的示例(请参见下面的链接。)
无论如何,基于您发布的堆栈跟踪,似乎CORBA.OBJ_ADAPTER被抛出到tWAS服务器上,并且客户端正在从服务器的回复消息中处理该摘录。可能需要从服务器进行跟踪。我还将在您的tWAS服务器上运行dumpnamespace,以便查看您要查找并尝试使用该拓扑的基于ejb的对象,而不是java:global名称。
关于您的具体问题:
如果以下文档都无济于事,那么最好在IBM支持下打开票证,以便我们可以更轻松地交换日志等,并吸引各种Liberty,tWAS命名/ EJB专家。
文档链接: