Определите переносимое имя JNDI в javax.enterprise.inject.spi.Extension
Я реализую адаптер входящих ресурсов JCA, чтобы EIS могла отправлять сообщения приложению, развернутому на сервере приложений Java EE.
Только EJB, аннотированные моей аннотацией, должны быть доступны, поэтому я использовал javax.enterprise.inject.spi.Extension, чтобы наблюдать ProcessAnnotatedType, который я затем могу использовать для хранения сведений обо всех методах EJB, аннотированных моей аннотацией, которые развернуты в приложении. сервер.
Аннотация содержит краткое уникальное имя, которое можно использовать как логическое имя службы для разрешения входящих вызовов из EIS. Эти вызовы затем отправляются через JNDI на соответствующую конечную точку.
На данный момент все работает нормально, но имя JNDI должно быть указано в качестве значения в моей аннотации. Я хотел бы удалить это требование, и чтобы мое расширение определяло глобальное портативное имя JNDI.
Поскольку я нахожусь внутри адаптера ресурсов JCA, я должен использовать форму java:global:
java:global[/application name]/module name/enterprise bean name[/interface name]
Мои примеры, которые я проверяю, включают в себя:
java:global/testappwar01/SimpleService!org.example.service.ISimpleService
java:global/testappear01/test-ejb/SimpleService!org.example.service.ISimpleService
Имя интерфейса и имя корпоративного компонента, которые я более или менее могу определить из объекта ProcessAnnotatedType, который я получаю, но имя приложения и имя модуля оказываются немного более неуловимыми.
Я попытался использовать поиск java:app/AppName и java: module / Module name. Они отлично работают с wildfly (10.x), когда развертывание -.war, но в пределах.ear эти значения по какой-то причине не существуют. В WebLogic 12.x эти значения не существуют вообще, независимо от типа архива развертывания.
Я ищу что-то, что будет работать на любом сервере приложений, совместимом с Java EE, поэтому в идеале без конкретных зависимостей сервера приложений. Хотя в худшем случае приемлемо то, что работает с weblogic и wildfly.
Обновлено - журнал wildfly:
Развернутые приложения не совсем такие, как описано ранее, я их санировал:
casual-test-app-0.0.1.ear имеет собственное имя в файле application.xml "casual-test-app-custom-2", которое содержит test-ejb.jar и test-ejb2.jar
В casual-java-testapp.war я могу заставить работать appName и moduleName.
casual-jca-0.0.1.ear - это мой ресурсный адаптер
2018-02-21 10:18:03,226 INFO [org.jboss.weld.deployer] (MSC service thread 1-7) WFLYWELD0003: Processing weld deployment casual-test-app-0.0.1.ear
2018-02-21 10:18:03,520 INFO [org.jboss.weld.deployer] (MSC service thread 1-3) WFLYWELD0003: Processing weld deployment casual-jca-0.0.1.ear
2018-02-21 10:18:03,852 INFO [org.jboss.weld.deployer] (MSC service thread 1-8) WFLYWELD0003: Processing weld deployment test-ejb.jar
2018-02-21 10:18:03,853 INFO [org.jboss.weld.deployer] (MSC service thread 1-2) WFLYWELD0003: Processing weld deployment test-ejb2.jar
2018-02-21 10:18:03,873 INFO [org.jboss.weld.deployer] (MSC service thread 1-5) WFLYWELD0003: Processing weld deployment casual-java-testapp.war
2018-02-21 10:18:03,877 INFO [org.jboss.as.ejb3.deployment] (MSC service thread 1-2) WFLYEJB0473: JNDI bindings for session bean named 'SimpleServiceNoViewEjb' in deployment unit 'subdeployment "test-ejb2.jar" of deployment "casual-test-app-0.0.1.ear"' are as follows:
java:global/casual-test-app-custom-2/test-ejb2/SimpleServiceNoViewEjb!se.kodarkatten.casual.example.service.SimpleServiceNoViewEjb
java:app/test-ejb2/SimpleServiceNoViewEjb!se.kodarkatten.casual.example.service.SimpleServiceNoViewEjb
java:module/SimpleServiceNoViewEjb!se.kodarkatten.casual.example.service.SimpleServiceNoViewEjb
java:global/casual-test-app-custom-2/test-ejb2/SimpleServiceNoViewEjb
java:app/test-ejb2/SimpleServiceNoViewEjb
java:module/SimpleServiceNoViewEjb
2018-02-21 10:18:03,878 INFO [org.jboss.as.ejb3.deployment] (MSC service thread 1-2) WFLYEJB0473: JNDI bindings for session bean named 'SimpleService2' in deployment unit 'subdeployment "test-ejb2.jar" of deployment "casual-test-app-0.0.1.ear"' are as follows:
java:global/casual-test-app-custom-2/test-ejb2/SimpleService2!se.kodarkatten.casual.example.service.ISimpleService2
java:app/test-ejb2/SimpleService2!se.kodarkatten.casual.example.service.ISimpleService2
java:module/SimpleService2!se.kodarkatten.casual.example.service.ISimpleService2
java:jboss/exported/casual-test-app-custom-2/test-ejb2/SimpleService2!se.kodarkatten.casual.example.service.ISimpleService2
java:global/casual-test-app-custom-2/test-ejb2/SimpleService2
java:app/test-ejb2/SimpleService2
java:module/SimpleService2
2018-02-21 10:18:03,881 INFO [org.jboss.as.ejb3.deployment] (MSC service thread 1-8) WFLYEJB0473: JNDI bindings for session bean named 'SimpleService2' in deployment unit 'subdeployment "test-ejb.jar" of deployment "casual-test-app-0.0.1.ear"' are as follows:
java:global/casual-test-app-custom-2/test-ejb/SimpleService2!se.kodarkatten.casual.example.service.ISimpleService2
java:app/test-ejb/SimpleService2!se.kodarkatten.casual.example.service.ISimpleService2
java:module/SimpleService2!se.kodarkatten.casual.example.service.ISimpleService2
java:jboss/exported/casual-test-app-custom-2/test-ejb/SimpleService2!se.kodarkatten.casual.example.service.ISimpleService2
java:global/casual-test-app-custom-2/test-ejb/SimpleService2
java:app/test-ejb/SimpleService2
java:module/SimpleService2
2018-02-21 10:18:03,909 INFO [org.jboss.weld.deployer] (MSC service thread 1-2) WFLYWELD0003: Processing weld deployment casual-jca-0.0.1.rar
2018-02-21 10:18:03,911 INFO [org.jboss.as.connector.deployment] (MSC service thread 1-2) WFLYJCA0002: Bound JCA ConnectionFactory [java:/JmsXA]
2018-02-21 10:18:03,912 INFO [org.wildfly.extension.messaging-activemq] (MSC service thread 1-2) WFLYMSGAMQ0002: Bound messaging object to jndi name java:jboss/DefaultJMSConnectionFactory
2018-02-21 10:18:03,916 INFO [org.jboss.weld.deployer] (MSC service thread 1-1) WFLYWELD0003: Processing weld deployment casual-inbound-handler-fielded-buffer.jar
2018-02-21 10:18:03,917 INFO [org.jboss.as.ejb3.deployment] (MSC service thread 1-1) WFLYEJB0473: JNDI bindings for session bean named 'FieldedBufferHandler' in deployment unit 'subdeployment "casual-inbound-handler-fielded-buffer.jar" of deployment "casual-jca-0.0.1.ear"' are as follows:
java:global/casual-jca-app/casual-inbound-handler-fielded-buffer/FieldedBufferHandler!se.kodarkatten.casual.jca.inbound.handler.buffer.BufferHandler
java:app/casual-inbound-handler-fielded-buffer/FieldedBufferHandler!se.kodarkatten.casual.jca.inbound.handler.buffer.BufferHandler
java:module/FieldedBufferHandler!se.kodarkatten.casual.jca.inbound.handler.buffer.BufferHandler
java:global/casual-jca-app/casual-inbound-handler-fielded-buffer/FieldedBufferHandler
java:app/casual-inbound-handler-fielded-buffer/FieldedBufferHandler
java:module/FieldedBufferHandler
2018-02-21 10:18:03,918 INFO [org.jboss.weld.deployer] (MSC service thread 1-7) WFLYWELD0003: Processing weld deployment casual-inbound-handler-jscd-buffer.jar
2018-02-21 10:18:03,919 INFO [org.jboss.weld.deployer] (MSC service thread 1-4) WFLYWELD0003: Processing weld deployment casual-inbound-handler-javaee-service.jar
2018-02-21 10:18:03,919 INFO [org.jboss.weld.deployer] (MSC service thread 1-3) WFLYWELD0003: Processing weld deployment casual-inbound-handler-casual-service.jar
2018-02-21 10:18:03,920 INFO [org.jboss.weld.deployer] (MSC service thread 1-6) WFLYWELD0003: Processing weld deployment casual-inbound.jar
2018-02-21 10:18:03,921 INFO [org.jboss.as.ejb3.deployment] (MSC service thread 1-7) WFLYEJB0473: JNDI bindings for session bean named 'JavaServiceCallBufferHandler' in deployment unit 'subdeployment "casual-inbound-handler-jscd-buffer.jar" of deployment "casual-jca-0.0.1.ear"' are as follows:
java:global/casual-jca-app/casual-inbound-handler-jscd-buffer/JavaServiceCallBufferHandler!se.kodarkatten.casual.jca.inbound.handler.buffer.BufferHandler
java:app/casual-inbound-handler-jscd-buffer/JavaServiceCallBufferHandler!se.kodarkatten.casual.jca.inbound.handler.buffer.BufferHandler
java:module/JavaServiceCallBufferHandler!se.kodarkatten.casual.jca.inbound.handler.buffer.BufferHandler
java:global/casual-jca-app/casual-inbound-handler-jscd-buffer/JavaServiceCallBufferHandler
java:app/casual-inbound-handler-jscd-buffer/JavaServiceCallBufferHandler
java:module/JavaServiceCallBufferHandler
2018-02-21 10:18:03,921 INFO [org.jboss.as.ejb3.deployment] (MSC service thread 1-3) WFLYEJB0473: JNDI bindings for session bean named 'CasualServiceHandler' in deployment unit 'subdeployment "casual-inbound-handler-casual-service.jar" of deployment "casual-jca-0.0.1.ear"' are as follows:
java:global/casual-jca-app/casual-inbound-handler-casual-service/CasualServiceHandler!se.kodarkatten.casual.jca.inbound.handler.service.ServiceHandler
java:app/casual-inbound-handler-casual-service/CasualServiceHandler!se.kodarkatten.casual.jca.inbound.handler.service.ServiceHandler
java:module/CasualServiceHandler!se.kodarkatten.casual.jca.inbound.handler.service.ServiceHandler
java:global/casual-jca-app/casual-inbound-handler-casual-service/CasualServiceHandler
java:app/casual-inbound-handler-casual-service/CasualServiceHandler
java:module/CasualServiceHandler
2018-02-21 10:18:03,921 INFO [org.jboss.as.ejb3.deployment] (MSC service thread 1-4) WFLYEJB0473: JNDI bindings for session bean named 'JavaeeServiceHandler' in deployment unit 'subdeployment "casual-inbound-handler-javaee-service.jar" of deployment "casual-jca-0.0.1.ear"' are as follows:
java:global/casual-jca-app/casual-inbound-handler-javaee-service/JavaeeServiceHandler!se.kodarkatten.casual.jca.inbound.handler.service.ServiceHandler
java:app/casual-inbound-handler-javaee-service/JavaeeServiceHandler!se.kodarkatten.casual.jca.inbound.handler.service.ServiceHandler
java:module/JavaeeServiceHandler!se.kodarkatten.casual.jca.inbound.handler.service.ServiceHandler
java:global/casual-jca-app/casual-inbound-handler-javaee-service/JavaeeServiceHandler
java:app/casual-inbound-handler-javaee-service/JavaeeServiceHandler
java:module/JavaeeServiceHandler
2018-02-21 10:18:03,964 INFO [org.jboss.as.ejb3.deployment] (MSC service thread 1-5) WFLYEJB0473: JNDI bindings for session bean named 'EchoService' in deployment unit 'deployment "casual-java-testapp.war"' are as follows:
java:global/casual-java-testapp/EchoService!se.kodarkatten.casual.example.EchoService
java:app/casual-java-testapp/EchoService!se.kodarkatten.casual.example.EchoService
java:module/EchoService!se.kodarkatten.casual.example.EchoService
java:global/casual-java-testapp/EchoService
java:app/casual-java-testapp/EchoService
java:module/EchoService
2018-02-21 10:18:03,968 INFO [org.jboss.as.ejb3.deployment] (MSC service thread 1-5) WFLYEJB0473: JNDI bindings for session bean named 'SimpleService' in deployment unit 'deployment "casual-java-testapp.war"' are as follows:
java:global/casual-java-testapp/SimpleService!se.kodarkatten.casual.example.service.ISimpleService
java:app/casual-java-testapp/SimpleService!se.kodarkatten.casual.example.service.ISimpleService
java:module/SimpleService!se.kodarkatten.casual.example.service.ISimpleService
java:jboss/exported/casual-java-testapp/SimpleService!se.kodarkatten.casual.example.service.ISimpleService
java:global/casual-java-testapp/SimpleService
java:app/casual-java-testapp/SimpleService
java:module/SimpleService
2018-02-21 10:18:03,968 INFO [org.jboss.as.ejb3.deployment] (MSC service thread 1-5) WFLYEJB0473: JNDI bindings for session bean named 'QueueService' in deployment unit 'deployment "casual-java-testapp.war"' are as follows:
java:global/casual-java-testapp/QueueService!se.kodarkatten.casual.example.QueueService
java:app/casual-java-testapp/QueueService!se.kodarkatten.casual.example.QueueService
java:module/QueueService!se.kodarkatten.casual.example.QueueService
java:global/casual-java-testapp/QueueService
java:app/casual-java-testapp/QueueService
java:module/QueueService
2018-02-21 10:18:03,972 INFO [org.jboss.as.ejb3.deployment] (MSC service thread 1-5) WFLYEJB0473: JNDI bindings for session bean named 'InboundOrderRestService' in deployment unit 'deployment "casual-java-testapp.war"' are as follows:
java:global/casual-java-testapp/InboundOrderRestService!se.kodarkatten.casual.example.inbound.InboundOrderRestService
java:app/casual-java-testapp/InboundOrderRestService!se.kodarkatten.casual.example.inbound.InboundOrderRestService
java:module/InboundOrderRestService!se.kodarkatten.casual.example.inbound.InboundOrderRestService
java:global/casual-java-testapp/InboundOrderRestService
java:app/casual-java-testapp/InboundOrderRestService
java:module/InboundOrderRestService
2018-02-21 10:18:03,973 INFO [org.jboss.as.ejb3.deployment] (MSC service thread 1-5) WFLYEJB0473: JNDI bindings for session bean named 'OrderRestService' in deployment unit 'deployment "casual-java-testapp.war"' are as follows:
java:global/casual-java-testapp/OrderRestService!se.kodarkatten.casual.example.order.OrderRestService
java:app/casual-java-testapp/OrderRestService!se.kodarkatten.casual.example.order.OrderRestService
java:module/OrderRestService!se.kodarkatten.casual.example.order.OrderRestService
java:global/casual-java-testapp/OrderRestService
java:app/casual-java-testapp/OrderRestService
java:module/OrderRestService
2018-02-21 10:18:03,974 INFO [org.jboss.as.ejb3.deployment] (MSC service thread 1-5) WFLYEJB0473: JNDI bindings for session bean named 'CasualOrderService' in deployment unit 'deployment "casual-java-testapp.war"' are as follows:
java:global/casual-java-testapp/CasualOrderService!se.kodarkatten.casual.example.service.order.ICasualOrderServiceRemote
java:app/casual-java-testapp/CasualOrderService!se.kodarkatten.casual.example.service.order.ICasualOrderServiceRemote
java:module/CasualOrderService!se.kodarkatten.casual.example.service.order.ICasualOrderServiceRemote
java:jboss/exported/casual-java-testapp/CasualOrderService!se.kodarkatten.casual.example.service.order.ICasualOrderServiceRemote
java:global/casual-java-testapp/CasualOrderService!se.kodarkatten.casual.example.service.order.ICasualOrderService
java:app/casual-java-testapp/CasualOrderService!se.kodarkatten.casual.example.service.order.ICasualOrderService
java:module/CasualOrderService!se.kodarkatten.casual.example.service.order.ICasualOrderService
2018-02-21 10:18:03,975 INFO [org.jboss.as.ejb3.deployment] (MSC service thread 1-5) WFLYEJB0473: JNDI bindings for session bean named 'OrderService' in deployment unit 'deployment "casual-java-testapp.war"' are as follows:
java:global/casual-java-testapp/OrderService!se.kodarkatten.casual.example.service.order.IOrderService
java:app/casual-java-testapp/OrderService!se.kodarkatten.casual.example.service.order.IOrderService
java:module/OrderService!se.kodarkatten.casual.example.service.order.IOrderService
java:global/casual-java-testapp/OrderService!se.kodarkatten.casual.example.service.order.IOrderServiceRemote
java:app/casual-java-testapp/OrderService!se.kodarkatten.casual.example.service.order.IOrderServiceRemote
java:module/OrderService!se.kodarkatten.casual.example.service.order.IOrderServiceRemote
java:jboss/exported/casual-java-testapp/OrderService!se.kodarkatten.casual.example.service.order.IOrderServiceRemote
2018-02-21 10:18:04,005 INFO [org.jboss.weld.Version] (MSC service thread 1-3) WELD-000900: 2.3.5 (Final)
2 ответа
Я нашел несколько разных способов реализовать это, но ни один из них не был абсолютно идеальным. В итоге мы решили пойти на решение 2, так как это работало в большинстве сценариев, которые мы должны поддерживать.
Решение 1. Используйте данные аннотации для создания сервиса, когда это необходимо
Использование CDI BeanManager для создания моего объекта удаленной службы на основе информации, обнаруженной в метаданных аннотации расширения SPI. Это как-то задокументировано здесь, в разделе 16.5, хотя вот последняя версия, которая сработала:
public Object getServiceReference( AnnotatedType<CasualService> type )
{
BeanManager beanManager = CDI.current().getBeanManager();
CreationalContext<CasualService> ctx = beanManager.createCreationalContext(null);
BeanAttributes<CasualService> attributes = beanManager.createBeanAttributes( type );
InjectionTargetFactory<CasualService> itf = beanManager.getInjectionTargetFactory( type );
Bean<CasualService> bean = beanManager.createBean( attributes, type.getJavaClass(), itf );
Object reference = beanManager.getReference( bean, type.getBaseType(), ctx );
return reference;
}
К сожалению, это хорошо работает только в Wildfly, а не в Weblogic. Проблема в weblogic была связана с тем, как реализация менеджера bean-компонентов Weblogic создает bean-компонент; он не использует текущий загрузчик классов Threads, что приводит к исключениям из-за неудовлетворенных зависимостей или не найденного класса.
Я также не был полностью удовлетворен необходимостью каждый раз создавать объект службы, поскольку параметры сервера приложений для кэша slb и т. Д. Не учитывались.
Решение 2. Выполните ленивый поиск с помощью JNDI-дерева обхода службы таймера для совпадений.
- При обнаружении аннотаций spi Extension сохраните все метаданные аннотации.
- Служба таймера периодически запускается для обхода дерева JNDI для поиска всех прокси-объектов / удаленных служб. (требуется служба таймера, потому что weblogic не имеет записей JNDI, доступных при запуске обнаружения расширения.)
- Используя метаданные аннотации службы, "сопоставьте" их с URL-адресами кандидатов JNDI. Соответствие на основе текста на основе информации из имен Global Portable JNDI
- Используя загрузчик классов прокси-объектов, загрузите класс реализации, чтобы проверить данные аннотации его методов, чтобы увидеть, был ли это ожидаемый сервис (класс загрузки требуется, поскольку методы прокси-класса не содержат метаданных аннотации)
- Повторяйте процесс, пока все службы не будут иметь соответствующий JNDI.
Существует несколько граничных случаев, когда сопоставление не работает, но для этих граничных случаев я создал другую аннотацию, которая может быть предоставлена в классе обслуживания, который жестко кодирует ожидаемый путь JNDI, поэтому нам не нужно искать.
Этот подход работает как в сети, так и в сети.
Как говорится в вашем журнале, вы можете получить доступ к своим EJB под любым из перечисленных имен JNDI
java:global/casual-test-app-custom-2/test-ejb/SimpleService2!se.kodarkatten.casual.example.service.ISimpleService2
java:app/test-ejb/SimpleService2!se.kodarkatten.casual.example.service.ISimpleService2
java:module/SimpleService2!se.kodarkatten.casual.example.service.ISimpleService2
java:jboss/exported/casual-test-app-custom-2/test-ejb/SimpleService2!se.kodarkatten.casual.example.service.ISimpleService2
java:global/casual-test-app-custom-2/test-ejb/SimpleService2
java:app/test-ejb/SimpleService2
java:module/SimpleService2
Вероятно, в вашем случае лучше всего подойдут те, у которых java:global/...