尝试在另一台服务器上调用 EJB 方法时出现 Websphere 错误

Posted

技术标签:

【中文标题】尝试在另一台服务器上调用 EJB 方法时出现 Websphere 错误【英文标题】:Websphere error while trying to call EJB methods on another server 【发布时间】:2011-08-09 05:43:03 【问题描述】:

我正在使用 EJB 2.x。我有 2 台机器,它们都在 WebSphere 7.0 上。 他们每个人都部署了不同的应用程序。当我尝试从一个应用程序(在 machine1 上)调用另一个应用程序的 EJB(在 machine2 上)时,我收到以下错误:

java.rmi.MarshalException: CORBA MARSHAL 0x4942f999 否;嵌套的 例外是:org.omg.CORBA.MARSHAL:长度的配置文件数据 读取 IOR 配置文件 vmcid 时出现 0x3f400000:IBM 次要代码:999 已完成:否

有没有人知道如何解决这个问题,因为我几乎被困在这个问题上。 谢谢!

编辑

对于 EJB 调用,我使用了常用方法:

Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");
props.put(Context.PROVIDER_URL, "iiop://remote.host.com:2809");
props.put(Context.SECURITY_PRINCIPAL, "remote_user");
props.put(Context.SECURITY_CREDENTIALS, "remote_pwd");
Context ctx = new InitialContext(props);
Object objRef = ctx.lookup("servicemanagerJndiName");
ServiceManagerHome home = (ServiceManagerHome) PortableRemoteObject.narrow(
        objRef, ServiceManagerHome.class);
manager = home.create();
manager.getMethod();...

问题是该服务调用在远程服务器上正确调用,并且响应已发送,就在客户端,我收到以下错误:

这是我收到的错误[SoapConnectorThreadPool : 5] [] ERROR java.rmi.MarshalException:CORBA MARSHAL 0x4942f999 否;嵌套的 例外是:org.omg.CORBA.MARSHAL:长度的配置文件数据 读取 IOR 配置文件 vmcid 时出现 0x3f400000:IBM 次要代码:999 已完成:否 com.ibm.CORBA.iiop.UtilDelegateImpl.mapSystemException(UtilDelegateImpl.java:277) 在 javax.rmi.CORBA.Util.mapSystemException(Util.java:84) 在 com.host.local.manager._ServiceManager_Stub.getMethod(_ServiceManager_Stub.java):

【问题讨论】:

您如何在另一台服务器上调用 EJB?你在使用外来细胞绑定等吗?详细说明设置并提供详细日志,以便我们尝试帮助您。芒卢 【参考方案1】:

我已经成功解决了这个问题。 ServiceManager(远程接口)和 ServiceManagerHome(主接口)所在的外部 jar 已被替换为内部也包含存根的 jar 文件。存根是使用 com.ibm.websphere.ant.tasks.WsEjbDeploy ant 任务创建的。你的蚂蚁应该看起来像这样:

    <taskdef name="wsejbdeploy" classname="com.ibm.websphere.ant.tasks.WsEjbDeploy>
        <classpath refid="your.websphere.classpath"/>
    </taskdef>
    <target name="packEjbJar">
        <jar destfile="pre-deploy-ejb.jar">
            <metainf dir="src" includes="ejb-jar.xml" />
            <metainf dir="src" includes="ibm-ejb-jar-bnd.xmi" />

            <fileset dir="your.build.classes.location">
                <include name="com/yourapp/ejb/**/*.*" />
            </fileset>
        </jar>
        <wsejbdeploy inputJar="pre-deploy-ejb.jar"
                            wasHome="your.websphere.home"
                            workingDirectory="dist"
                            outputJar="ejb.jar"
                            codegen="false"
                            keepGenerated="false"
                            quiet="false"
                            noValidate="true"
                            noWarnings="false"
                            noInform="false"
                            failonerror="true"
                            trace="true"
                            classpathref="your.classpath" />
    </target>

在此之后,存根将被打包在 ejb.jar 中。使用这个新 jar 重新部署后,我的应用程序工作得很好。 注意您需要填充 ibm-ejb-jar-bnd.xmi 以便创建存根。以下是该文件的示例内容:

<ejbbnd:EJBJarBinding xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ejbbnd="ejbbnd.xmi" xmlns:ejb="ejb.xmi" xmi:id="ejb-jar_ID_Bnd">
  <ejbJar href="META-INF/ejb-jar.xml#ejb-jar_ID"/>
  <ejbBindings xmi:id="Session_ServiceManager_Bnd" jndiName="com.host.local.manager.ServiceManager">
    <enterpriseBean xmi:type="ejb:Session" href="META-INF/ejb-jar.xml#Session_ServiceManager"/>
  </ejbBindings>
</ejbbnd:EJBJarBinding>

附:另外,要从 ma​​chine1 访问远程 bean(在 ma​​chine2 上)我需要设置 C:\WINDOWS\system32\drivers\etc\hosts文件,并在列表中添加IP和远程名称 机器2

希望这些信息对某人有用。

【讨论】:

以上是关于尝试在另一台服务器上调用 EJB 方法时出现 Websphere 错误的主要内容,如果未能解决你的问题,请参考以下文章

从另一个网络上的另一台计算机访问 db 时出现错误 #1045

如何在 ionicApp 中播放托管在另一台服务器上的视频

远程 EJB 调用的事务

开发机器上的网络核心 Web api 应用程序上的 Kestrel 错误,但在另一台机器上却没有

使用对Wildfly 10的远程EJB调用进行身份验证时出现问题

为啥在导入 p12 文件时出现错误?