首页 > 解决方案 > 使用 websphere liberty 应用程序从经典 websphere 应用程序访问远程 ejb

问题描述

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

背景

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

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


问题

  1. 远程 ejb 调用的旧实现不适用于 websphere liberty。我做了很多研究,并且能够迁移远程 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发送)

基础设施信息:

WAS8IBM J9 VM使用 java 版本 1.6.0 在我的公司 Intranet 中托管的 linux 服务器上运行。WAS8 是版本 8.0.0.15 ND。

websphere libertyJava HotSpot(TM) 64-Bit Server VM在 Windows 10 机器上使用 java 版本 1.8.0_172-b11 运行,通过 VPN 连接到与 WAS8 应用程序服务器相同的网络区域。Liberty 是版本 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 的文档?

标签: javajakarta-eeejbwebsphere-libertywebsphere-8

解决方案


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

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

至于你的具体问题:

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

如果以下文档没有任何帮助,最好在 IBM 支持下开票,这样我们就可以更轻松地交换日志等,并利用各种 Liberty、tWAS 命名/EJB 专家。

文档链接:


推荐阅读