Мне нужна помощь при использовании удаленных вызовов ejb. Существует следующая настройка:
Фон
Веб-приложение JavaEE (с именем app1 ) размещено на сервере приложений oldschool WAS8 . Приложение предоставляет по крайней мере один (известный) удаленный ejb для обмена данными между приложениями.
Другое веб-приложение JavaEE (с именем app2 ) размещено на сервере websphere liberty . (В настоящее время мы переносим это приложение из WAS8 в websphere liberty.) Это приложение (app2) теперь должно получить доступ к удаленному ejb, предоставленному app1.
Проблемы
Старая реализация удаленного вызова 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);
}
Этот код компилируется и является исполняемым без каких-либо исключений из имен.
Я все еще не могу успешно запросить какой-либо удаленный объект 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
Вопрос:
Правильно ли указан адрес 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
Можно ли вызвать удаленный ejb из другого jvm другого поставщика или другой версии в целом?
Есть ли какая-либо документация по WAS8 относительно его NameService?