当前位置: 首页 > 知识库问答 >
问题:

如何从瘦客户端到WebSphere Liberty进行远程EJB调用

孙梓
2023-03-14

我正在尝试从瘦客户端对WebSphere Liberty20.0.0.10(JDK 8)进行远程EJB 3调用。客户端不在EJB容器中运行。我谷歌了这个页面,并尝试按照说明进行操作:https://www.ibm.com/support/knowledgecenter/SSD28V_liberty/com.ibm.websphere.wlp.core.doc/ae/twlp_ejb_remote.html

根据服务器日志,EJB绑定到这个地址:

CNTR0167I: The server is binding the fi.datawell.cs.ejb.logging.boundary.DW_CS_LoggingServices interface of the DW_CS_LoggingRemoteServicesBean enterprise bean in the codeserver.war module of the codeserver application.  The binding location is: java:global/codeserver/DW_CS_LoggingRemoteServicesBean!fi.datawell.cs.ejb.logging.boundary.DW_CS_LoggingServices

(代码服务器是应用程序的名称,只有一个包含 EJB 的 war 模块)

我可以在本地调用它,没有问题。我尝试用这个字符串远程查找它:

corbaname::localhost:12809#ejb/global/codeserver/DW_CS_LoggingRemoteServicesBean!fi\.datawell\.cs\.ejb\.logging\.boundary\.DW_CS_LoggingServices

(IIOP服务在端口12809中)

不知怎的,我在日志中得到了这个错误,尽管它不会在应用程序中引起异常。

WARNING: "IOP00410201: (COMM_FAILURE) Connection failure: socketType: IIOP_CLEAR_TEXT; hostname: localhost; port: 0"
org.omg.CORBA.COMM_FAILURE:   vmcid: SUN  minor code: 201  completed: No
        at com.sun.corba.se.impl.logging.ORBUtilSystemException.connectFailure(ORBUtilSystemException.java:2200)
        at com.sun.corba.se.impl.logging.ORBUtilSystemException.connectFailure(ORBUtilSystemException.java:2221)
        at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(SocketOrChannelConnectionImpl.java:223)
        at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(SocketOrChannelConnectionImpl.java:236)
        at com.sun.corba.se.impl.transport.SocketOrChannelContactInfoImpl.createConnection(SocketOrChannelContactInfoImpl.java:119)
        at com.sun.corba.se.impl.protocol.CorbaClientRequestDispatcherImpl.beginRequest(CorbaClientRequestDispatcherImpl.java:187)
        at com.sun.corba.se.impl.protocol.CorbaClientDelegateImpl.request(CorbaClientDelegateImpl.java:137)
        at com.sun.corba.se.impl.protocol.CorbaClientDelegateImpl.is_a(CorbaClientDelegateImpl.java:229)
        at org.omg.CORBA.portable.ObjectImpl._is_a(ObjectImpl.java:130)
        at org.omg.CosNaming.NamingContextHelper.narrow(NamingContextHelper.java:69)
        at com.sun.jndi.cosnaming.CNCtx.callResolve(CNCtx.java:504)
        at com.sun.jndi.cosnaming.CNCtx.lookup(CNCtx.java:555)
        at com.sun.jndi.toolkit.url.GenericURLContext.lookup(GenericURLContext.java:205)
        at javax.naming.InitialContext.lookup(InitialContext.java:417)
        at fi.datawell.cs.ejb.DW_CS_EjbFactory.lookupService(DW_CS_EjbFactory.java:91)
        at fi.datawell.cs.ejb.DW_CS_EjbFactory.lookupLoggingRemoteServicesEJB(DW_CS_EjbFactory.java:284)
        at fi.datawell.cs.application.clients.versionloader.DW_CS_VersionLoaderWorker.fetchClientServices(DW_CS_VersionLoaderWorker.java:983)
        at fi.datawell.cs.application.clients.versionloader.DW_CS_VersionLoader.initialize(DW_CS_VersionLoader.java:114)
        at fi.datawell.cs.application.clients.versionloader.DW_CS_VersionLoader.main(DW_CS_VersionLoader.java:252)
Caused by: java.net.BindException: Cannot assign requested address: connect
        at sun.nio.ch.Net.connect0(Native Method)
        at sun.nio.ch.Net.connect(Net.java:454)
        at sun.nio.ch.Net.connect(Net.java:446)
        at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:648)
        at java.nio.channels.SocketChannel.open(SocketChannel.java:189)
        at com.sun.corba.se.impl.transport.DefaultSocketFactoryImpl.createSocket(DefaultSocketFactoryImpl.java:95)
        at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(SocketOrChannelConnectionImpl.java:207)
        ... 16 more

这个地址似乎是正确的,因为如果我更改端口,我会得到“连接被拒绝”,如果我更改bean名称,我会获得NameNotFoundException。

我得到一个com.sun.corba.se.impl.corba.CORBAObjectImpl的实例作为响应,但是当我使用PortableRemoteObject.narrow()方法时,我毫无例外地得到null。现在我想知道我做错了什么。虽然这是EJB 3应用程序,但我需要某种EJB存根吗?

附录:实际上,我们正在做从传统 WebSphere 到 WebSphere Liberty 的迁移,我认为我们可以摆脱运行 createEJBStubs,因为它很慢(使用 maven 插件),并且需要 WAS 传统安装(这在 Mac 上不可用)。现在我尝试了创建EJB存根,并得到了进一步的了解。首先,我必须将 com.ibm.websphere.javaee.ejb.3.2_1.0.45.jar 添加到类路径中。在那之后,事情变得更远了。我可以获取 EJB,但第一次尝试使用它失败,并有一个熟悉的异常:

javax.ejb.EJBException: nested exception is: java.rmi.MarshalException: CORBA COMM_FAILURE 1398079689 No; nested exception is: 
    org.omg.CORBA.COMM_FAILURE:   vmcid: SUN  minor code: 201  completed: No
    at fi.datawell.cs.ejb.logging.boundary._DW_CS_LoggingServices_Stub.log(_DW_CS_LoggingServices_Stub.java:1101)
    at fi.datawell.cs.application.clients.core.DW_CS_BaseWorker.writeCodeServerLog(DW_CS_BaseWorker.java:66)
    at fi.datawell.cs.application.clients.versionloader.DW_CS_VersionLoader.initialize(DW_CS_VersionLoader.java:120)
    at fi.datawell.cs.application.clients.versionloader.DW_CS_VersionLoader.main(DW_CS_VersionLoader.java:252)
Caused by: java.rmi.MarshalException: CORBA COMM_FAILURE 1398079689 No; nested exception is: 
    org.omg.CORBA.COMM_FAILURE:   vmcid: SUN  minor code: 201  completed: No
    at com.sun.corba.se.impl.javax.rmi.CORBA.Util.mapSystemException(Util.java:219)
    at javax.rmi.CORBA.Util.mapSystemException(Util.java:95)
    at fi.datawell.cs.ejb.logging.boundary._DW_CS_LoggingServices_Stub.log(_DW_CS_LoggingServices_Stub.java:1)
    ... 3 more
Caused by: org.omg.CORBA.COMM_FAILURE:   vmcid: SUN  minor code: 201  completed: No
    at com.sun.corba.se.impl.logging.ORBUtilSystemException.connectFailure(ORBUtilSystemException.java:2200)
    at com.sun.corba.se.impl.logging.ORBUtilSystemException.connectFailure(ORBUtilSystemException.java:2221)
    at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(SocketOrChannelConnectionImpl.java:223)
    at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(SocketOrChannelConnectionImpl.java:236)
    at com.sun.corba.se.impl.transport.SocketOrChannelContactInfoImpl.createConnection(SocketOrChannelContactInfoImpl.java:119)
    at com.sun.corba.se.impl.protocol.CorbaClientRequestDispatcherImpl.beginRequest(CorbaClientRequestDispatcherImpl.java:187)
    at com.sun.corba.se.impl.protocol.CorbaClientDelegateImpl.request(CorbaClientDelegateImpl.java:137)
    at org.omg.CORBA.portable.ObjectImpl._request(ObjectImpl.java:449)
    at fi.datawell.cs.ejb.logging.boundary._DW_CS_LoggingServices_Stub.log(_DW_CS_LoggingServices_Stub.java)
    ... 3 more
Caused by: java.net.BindException: Cannot assign requested address: connect
    at sun.nio.ch.Net.connect0(Native Method)
    at sun.nio.ch.Net.connect(Net.java:454)
    at sun.nio.ch.Net.connect(Net.java:446)
    at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:648)
    at java.nio.channels.SocketChannel.open(SocketChannel.java:189)
    at com.sun.corba.se.impl.transport.DefaultSocketFactoryImpl.createSocket(DefaultSocketFactoryImpl.java:95)
    at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(SocketOrChannelConnectionImpl.java:207)
    ... 9 more

现在我不知道下一步该尝试什么。每当检索到EJB时,日志上仍然会出现相同的异常,但在这种情况下,它似乎被静默消耗了。我想知道为什么异常中有端口0…

共有1个答案

黄伟
2023-03-14

WebSphere Liberty不提供EJB瘦客户端,但是,您可以使用WebSphere传统瘦客户端来访问WebSphere Liberty服务器:

https://www.ibm.com/support/knowledgecenter/SSAW57_8.5.5/com.ibm.websphere.nd.multiplatform.doc/ae/tcli_ejbthinclient.html

对于瘦客户机,无论使用2.x还是3.x API,所有EJB远程接口都需要一个存根。对于EJB2.x,您可以使用带有-iiop选项的RMIC。对于EJB3.x(此处使用),您需要使用WebSphere traditional提供的createEJBStubs命令:

https://www.ibm.com/support/knowledgecenter/en/SSEQTP_8.5.5/com.ibm.websphere.base.doc/ae/rejb_3stubscmd.html

< code > createejb subs 也可以用于EJB 2.x远程接口。

请注意,存根是在启用了 ejbRemote-3.2 功能的 WebSphere 服务器进程中或在应用程序客户机进程(即胖客户机)中为您生成的。有关应用程序客户端的详细信息,请参阅此处:

https://www.ibm.com/support/knowledgecenter/SSEQTP_liberty/com.ibm.websphere.wlp.doc/ae/twlp_setup_prepareappclient.html

由于您收到的是一个CORBAObjectImpl,并且窄的不起作用,因此似乎至少部分问题是缺乏Stub类。

 类似资料:
  • 问题内容: 根据EJB客户端应用程序上的Netbeans教程,我似乎无法调用该方法: 编译错误: 客户: ejb: 远程接口: 现在,如果接口被修改: Bean现在可以使用以下方法: 但是,有一个NPE: 如何正确调用该方法?EJB未实例化? 问题答案: 我从头开始。我能想到的唯一区别是,我没有创建EJB应用程序,而是为bean创建了EJB模块。否则,我认为是相同的。 结构体: 客户代码: 豆:

  • 我试图使用JBoss7.1.1中的JNDI从远程客户端调用,但我得到了一个异常: 我使用的是jboss的安全机制,并且我已经通过add-user.bat添加了用户,还有带有用户名和密码的jboss-ejb-client.properties文件,但仍然会得到异常。我遵循了链接的示例集:使用JNDI从远程客户端进行EJB调用,当我不使用安全机制时也是如此,但是当我使用安全机制时,就会出现错误 你错过

  • 问题内容: 我在远程Glassfish服务器和计算机上的应用程序客户端中都有一个EJB模块。我想从应用程序客户端连接到远程EJB。 这是我的EJB接口: 这是我的ejb: 我有几个问题: 我可以在远程应用程序客户端中使用依赖注入来连接到ejb吗?如果是这样,我该怎么做才能做到这一点。我是否需要在sun-ejb-jar.xml和sun-application-client.xml中进行配置?换句话说

  • 我需要能够从这个简单的摇摆java应用程序调用保存()方法到我的Web应用程序,该应用程序在服务器上发布,其中包含我用来保存新实体类型类角色的bean,该类具有名称、地址、电子邮件。 我在使用wildfly 8。x代表我的服务器,并按以下方式发布我的web应用: 这是我的ContactoDAO Bean: 在我的简单客户端swing应用程序上,我的设置如下: 您可以在上面的代码中看到我使用它来调用

  • 我已经在CentOS上安装了SQLPLUS瘦客户端。通过客户端,我试图与Oracle 12c建立TCPS连接。但是当我使用以下命令时,我得到“ORA-28759:打开文件失败”异常。然而,当我使用传输控制协议时,它工作正常。 这不起作用:sudo-sqlplus-s“user/pwd002@(描述=(地址=(协议=TCPS)(端口=1522)(主机=test.co.uk))(连接数据=(服务名称=

  • 我们开发了一个培训应用程序,其中包含一个与EJB通信的独立java客户端。工作设置包括Windows 7上的JBoss AS 7.1和通过/bin/add user创建的应用程序用户。球棒 客户端是这样编码的: 客户端是用jboss客户端启动的。类路径中的jar。 现在,我们尝试改用WildFly 8.1,它已成功部署,但客户端失败 将JNDI查找名称更改为在部署期间打印出来的内容(例如)导致 在