使用Websphere Libertyty应用程序从经典Websphere应用程序访问远程ejb

时间:2019-01-14 13:02:23

标签: java java-ee ejb websphere-liberty websphere-8

我需要使用远程ejb调用的帮助。有以下设置:

背景

一个JavaEE Web应用程序(将其命名为 app1 )托管在一个老式的 WAS8应用程序服务器上。该应用程序至少提供一个(已知的)远程ejb以便应用程序与应用程序进行通信。

另一个JavaEE Web应用程序(将其命名为 app2 )托管在 websphere自由服务器上。 (我们目前正在将该应用程序从WAS8迁移到Websphere自由。)现在,该应用程序(app2)必须访问app1提供的远程ejb。


问题

  1. 远程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);
    }
    

    此代码可以编译并且可以执行,没有任何命名异常。

  2. 我仍然无法成功请求任何远程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

问题:

  1. 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 
    
  2. 是否可以从其他供应商(通常是不同版本)的其他jvm调用远程ejb?

  3. 是否有关于WAS8的NameService的任何文档?

1 个答案:

答案 0 :(得分:0)

DeveloperWorks中类似的thread讨论了Liberty客户端在tWAS中调用EJB的问题。当时,有人质疑Liberty是否具有此功能。此后已实施RFE 32815。 Liberty文档显示了EJB查找的示例(请参见下面的链接。)

无论如何,基于您发布的堆栈跟踪,似乎CORBA.OBJ_ADAPTER被抛出到tWAS服务器上,并且客户端正在从服务器的回复消息中处理该摘录。可能需要从服务器进行跟踪。我还将在您的tWAS服务器上运行dumpnamespace,以便查看您要查找并尝试使用该拓扑的基于ejb的对象,而不是java:global名称。

关于您的具体问题:

  • A1。虽然“ java:global”间接名称可能是有效的,但我在tWAS名称空间中看到的大多数查询都使用基于拓扑的限定名称(例如cell // node /...)
  • A2。通常,是的,应该在不同的CORBA /命名版本与供应商之间存在互操作性。
  • A3。请参阅下面列出的链接。

如果以下文档都无济于事,那么最好在IBM支持下打开票证,以便我们可以更轻松地交换日志等,并吸引各种Liberty,tWAS命名/ EJB专家。

文档链接: