java - 使用 websphere liberty 应用程序从经典 websphere 应用程序访问远程 ejb
问题描述
我需要一些使用远程 ejb 调用的帮助。有以下设置:
背景:
JavaEE Web 应用程序(将其命名为app1)托管在老式WAS8 应用程序服务器上。应用程序提供至少一个(已知的)远程 ejb 用于应用程序到应用程序的通信。
另一个 JavaEE Web 应用程序(将其命名为app2)托管在websphere liberty server 上。(我们目前正在将此应用程序从 WAS8 迁移到 websphere liberty。)此应用程序 (app2) 现在必须访问 app1 提供的远程 ejb。
问题:
远程 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); }
此代码可编译并可在没有任何命名异常的情况下执行。
我仍然无法成功请求任何远程 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
问题:
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 的文档?
解决方案
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 专家。
文档链接:
推荐阅读
- r - Shiny - 模块内动态生成的 actionButton 不能与 observeEvent 一起使用
- php - 使用多个表从 xenforo 数据库在 Laravel 中进行用户身份验证
- python - VSCode调试芹菜工人
- python - 基于字典分配的列中的无序值
- postgresql - 如何将 GeoJSON 地理数据转换为 PostGIS?
- c# - 使用帖子插入一些数据但实体模型对象带有空值?
- go - 不能使用 p[idx + 1:] (type []Person) 作为类型 Person in append
- javascript - 如何解决“我的第一个扫描值与我的第二个扫描值不同并且 HTML 中的值扫描与记事本中的值扫描不同?”
- vbscript - ForWriting 和 ForAppending VBS 的区别
- python-3.x - 使用 SQLAlchemy 向某些对象添加自定义删除行为