Ошибка Websphere при попытке вызвать методы EJB на другом сервере

Я использую 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 завершено: нет

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

Изменить:

Для вызова 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: данные профиля длиной 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):


person Igor    schedule 09.08.2011    source источник
comment
Как вы вызываете EJB на другом сервере? Используете ли вы привязки к чужим ячейкам и т. д.? Уточните настройку и предоставьте подробные журналы, чтобы мы могли попытаться вам помочь. Манглу   -  person Manglu    schedule 09.08.2011


Ответы (1)


Я успешно решил проблему. Внешняя банка, в которой находились 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. Кроме того, для доступа к удаленным компонентам (на машине2) с машины1 мне нужно было установить файл C:\WINDOWS\system32\drivers\etc\hosts , и добавить в список IP и имя удаленной машины2

Надеюсь, что эта информация окажется для кого-то полезной.

person Igor    schedule 09.08.2011