尝试在另一台服务器上调用 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>
附:另外,要从 machine1 访问远程 bean(在 machine2 上)我需要设置 C:\WINDOWS\system32\drivers\etc\hosts文件,并在列表中添加IP和远程名称 机器2
希望这些信息对某人有用。
【讨论】:
以上是关于尝试在另一台服务器上调用 EJB 方法时出现 Websphere 错误的主要内容,如果未能解决你的问题,请参考以下文章
从另一个网络上的另一台计算机访问 db 时出现错误 #1045
开发机器上的网络核心 Web api 应用程序上的 Kestrel 错误,但在另一台机器上却没有