我正在实现JCA入站资源适配器,以允许EIS将消息发送到部署在Java EE Application Server上的应用程序。
只能访问带有我注释的注释的EJB在应用程序服务器上。
注释包含一个简短的唯一名称,可以像逻辑服务名称一样使用,以允许来自EIS的入站呼叫。然后,通过JNDI将这些调用派遣到相应的端点。
目前这一切都很好,但是当前必须提供JNDI名称作为我的注释中的值。我想删除此要求,并让我的扩展名确定全局便携式JNDI名称。
当我在JCA资源适配器中时,我必须使用Java:全局表格:
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对象中,接口名称和企业bean名称我或多或少可以奏效,但是应用程序名称和模块名称被证明更难以捉摸。
我尝试使用Java的查找:App/AppName和Java:模块/模块名称。当部署是一个.war时,它们与野生蝇(10.x(一起工作,但是在.ear中,由于某种原因不存在这些值。在Weblogic 12.x中,这些值根本不存在,无论部署档案类型如何。
我正在寻找可以在任何符合Java EE的应用程序服务器上使用的东西,因此理想情况下,没有App Server特定的依赖项。尽管情况更糟糕的情况可以接受WebLogic和Wildfly的效果。
更新-Wildfly Log:
部署的应用程序并不完全如前所述,我对它们进行了消毒:
casual-test-app-0.0.0.1.ear在application.xml" casual-test-app-custom-2"中具有自定义名称,其中包含test-ejb.jar和test-ejb2.jar
休闲 - java-testapp.war是我可以在这里获得appname和moduleName工作的地方。
cutual-jca-0.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)
,因为您的日志说您可以在列出的JNDI名称
下访问EJBjava: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/...效果最好。
我找到了几种实施此方法的方法,但没有一个完全理想。最后,我们选择了解决方案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;
}
不幸的是,这只能在野生蝇中效果很好,而不是在博客中。Weblogic中的问题是由于Weblogic Bean Manager实施创建BEAN的方式。它没有使用当前的线程classloader而导致异常,因为依赖性不满意或找不到类。
我也对每次需要创建服务对象并不完全满意,因为SLB高速缓存等的应用程序服务器设置将不会受到尊重。
解决方案2-用计时器服务遍历jndi树的懒惰查找
- 在SPI扩展发现注释期间,保存所有注释元数据。
- 计时器服务定期运行以遍历JNDI树,以找到所有代理对象/远程服务。(需要计时器服务,因为weblogic在扩展发现运行时没有可用的JNDI条目。(
- 使用服务注释元数据将它们"匹配"到候选JNDI URL。基于文本的匹配基于全局便携式JNDI名称的信息
- 使用代理对象classLoader加载实现类以检查其方法注释数据,以查看是否是预期服务(由于代理类方法不包含任何注释元数据,因此需要加载类(
- 重复过程,直到所有服务都具有匹配的jndi。
在某些边缘情况下,该匹配项不起作用,但是对于那些边缘情况,我创建了另一个可以在硬编码的服务类中提供的注释,该注释是预期的JNDI路径,因此我们不必搜索。
这种方法在Wildfly和Weblogic中都起作用。