Доступ к удаленному ejb из классического приложения websphere с помощью приложения websphere liberty - PullRequest
0 голосов
/ 14 января 2019

Мне нужна помощь при использовании удаленных вызовов ejb. Существует следующая настройка:

Фон

Веб-приложение JavaEE (с именем app1 ) размещено на сервере приложений oldschool WAS8 . Приложение предоставляет по крайней мере один (известный) удаленный ejb для обмена данными между приложениями.

Другое веб-приложение JavaEE (с именем app2 ) размещено на сервере websphere liberty . (В настоящее время мы переносим это приложение из WAS8 в websphere liberty.) Это приложение (app2) теперь должно получить доступ к удаленному ejb, предоставленному app1.


Проблемы

  1. Старая реализация удаленного вызова ejb не имела свободы веб-сферы. Я провел много исследований и смог перенести удаленный вызов ejb. Это выглядит так:

    try {
    
        // Holds the server address 
        String server = "server.address:port";
    
        // Building JNDI address:
        // E.g. corbaname:iiop:server:port/java:global/app1/ejb-module/BeanImpl!qualified.name.of.RemoteBean
        StringBuilder address = new StringBuilder("corbaname:iiop:") // Protocol
                .append(server) // Server address
                .append("/") // Separator
                .append("java:") // EJB context
                .append("global/") // Globales Repository
                .append("app1/") // Applikation
                .append("ejb-module/") // module
                .append("BeanImpl!") // Bean
                .append("qualified.name.of.RemoteBean"); // Remote Interface
    
        // Performing jndi lookup (shadowed remote ejb call by context (liberty server))
        Object o = InitialContext.doLookup(address.toString());
    
        // Casting requested object
        service = (qualified.name.of.RemoteBean) PortableRemoteObject.narrow(o,
                qualified.name.of.RemoteBean.class);
    } catch (NamingException e) {
    
        // Catching naming errors
        log.warn("Cannot read app1 URL from JNDI: {}.", e.getMessage());
        log.error("Exeption: ", e);
    } catch (SystemException e) {
    
        // Catching any other error
        log.warn("Cannot connect to app1: {}", e.getMessage());
        log.error("Exeption: ", e);
    }
    

    Этот код компилируется и является исполняемым без каких-либо исключений из имен.

  2. Я все еще не могу успешно запросить какой-либо удаленный объект ejb. При каждом запросе возникает исключение org.omg.CORBA.OBJ_ADAPTER со следующей трассировкой стека (сообщение об ошибке: org.omg.CORBA.OBJ_ADAPTER: : vmcid: 0x4942f000 minor code: 0xb81 completed: No):

     Exeption:  org.omg.CORBA.OBJ_ADAPTER: 
        at org.apache.yoko.orb.OB.Util.unmarshalSystemException(Util.java:165)
        at org.apache.yoko.orb.OB.GIOPConnection.processReply(GIOPConnection.java:543)
        at org.apache.yoko.orb.OB.GIOPConnection.processMessage(GIOPConnection.java:365)
        at org.apache.yoko.orb.OB.GIOPConnectionThreaded.execReceive(GIOPConnectionThreaded.java:429)
        at org.apache.yoko.orb.OB.GIOPConnectionThreaded.access$200(GIOPConnectionThreaded.java:42)
        at org.apache.yoko.orb.OB.GIOPConnectionThreaded$Receiver.run(GIOPConnectionThreaded.java:68)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
    

Понятия не имею, что там происходит. Я предполагаю, что запрашивающая виртуальная машина (Oracle Java 8) не может прочитать объект из ответа (отправленного из IBM J9 VM с Java 6)

Информация об инфраструктуре:

WAS8 работает с IBM J9 VM с java версии 1.6.0 на сервере Linux, размещенном в интранете моей компании. WAS8 - это версия 8.0.0.15 ND.

Websphere liberty работает с Java HotSpot(TM) 64-Bit Server VM с версией java 1.8.0_172-b11 на машине с windows 10, подключенной через VPN к той же сетевой зоне, что и сервер приложений WAS8. Liberty - версия 18.0.0.2

Вопрос:

  1. Правильно ли указан адрес JNDI? Привязка удаленного ejb следующая (из журнала запуска сервера):

    [1/11/19 13:26:21:230 CET] 00000008 EJBContainerI I   CNTR0167I: The server is binding the qualified.name.of.RemoteBeaninterface of the BeanImplenterprise bean in the ejb-module.jar module of the app1 application.  The binding location is: BeanImpl
    [1/11/19 13:26:21:246 CET] 00000008 AbstractEJBRu I   CNTR0167I: The server is binding the qualified.name.of.RemoteBeaninterface of the BeanImplenterprise bean in the ejb-module.jar module of the app1 application.  The binding location is: java:global/app1/ejb-module/BeanImpl!qualified.name.of.RemoteBeaninterface 
    
  2. Можно ли вызвать удаленный ejb из другого jvm другого поставщика или другой версии в целом?

  3. Есть ли какая-либо документация по WAS8 относительно его NameService?

1 Ответ

0 голосов
/ 17 января 2019

Подобный поток в DeveloperWorks обсуждает проблему клиента Liberty, вызывающего EJB в tWAS. В то время возник вопрос о том, обладает ли Liberty этой функциональностью. С тех пор RFE 32815 был реализован. И документ Liberty показывает примеры поиска EJB (см. Ссылки, приведенные ниже.)

В любом случае, основываясь на оставленной вами трассировке стека, создается впечатление, что CORBA.OBJ_ADAPTER выбрасывается на сервер tWAS, и клиент обрабатывает это исключение из ответного сообщения с сервера. Трассировка с сервера может быть необходима. Я также запустил бы dumpnamespace на вашем tWAS-сервере, чтобы увидеть объект ejb на основе топологии, который вы пытаетесь найти, и попытаться использовать его вместо java: global name.

Что касается ваших конкретных вопросов:

  • A1. Хотя косвенное имя «java: global» может быть допустимым, в большинстве поисков, которые я вижу в пространстве имен tWAS, используются топологические имена на основе топологии (например, ячейка // узел /...)
  • A2. В общем, да, взаимодействие между различными версиями CORBA / Naming и поставщиками должно существовать.
  • A3. Смотрите ссылки, перечисленные ниже.

Если ни один из следующих документов не поможет, было бы лучше открыть заявку при поддержке IBM, чтобы мы могли легче обмениваться журналами и т. Д. И обращаться к различным экспертам Liberty, tWAS Naming / EJB.

Ссылки на документы:

...