Ошибка Websphere при попытке вызвать методы EJB на другом сервере - PullRequest
0 голосов
/ 09 августа 2011

Я использую EJB 2.x . У меня есть 2 машины, обе на WebSphere 7.0 . На каждом из них развернуто разное приложение. Когда я пытаюсь из одного приложения (на машине1) вызвать EJB другого приложения (на машине2), я получаю следующую ошибку:

java.rmi.MarshalException: CORBA MARSHAL 0x4942f999 Нет; вложенными исключение: org.omg.CORBA.MARSHAL: данные профиля длины 0x3f400000 при чтении профиля IOR vmcid: младший код IBM: 999 завершено: нет

Кто-нибудь знает, как решить эту проблему, потому что я в значительной степени застрял в этой проблеме. Thanx!

Редактировать

Для вызова 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] [] ОШИБКА java.rmi.MarshalException: CORBA MARSHAL 0x4942f999 Нет; вложенными исключение: org.omg.CORBA.MARSHAL: данные профиля длины 0x3f400000 при чтении профиля IOR vmcid: младший код 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):

1 Ответ

0 голосов
/ 09 августа 2011

Я успешно решил проблему. Внешний jar, в котором хранились ServiceManager (удаленный интерфейс) и ServiceManagerHome (домашний интерфейс), был заменен файлом 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 . После повторного использования этой новой банки мое приложение работает нормально. Примечание Вам нужно будет заполнить 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>

P.S. Кроме того, для доступа к удаленным компонентам (на machine2 ) из machine1 мне нужно было установить C: \ WINDOWS \ system32 \ drivers \ etc \ hosts и добавьте в список IP и имя удаленного machine2

Надеюсь, эта информация кому-нибудь пригодится.

...