在Javax.enterprise.inject.spi.extension中确定JNDI便携式名称



我正在实现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名称

下访问EJB
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/...效果最好。

我找到了几种实施此方法的方法,但没有一个完全理想。最后,我们选择了解决方案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树的懒惰查找

  1. 在SPI扩展发现注释期间,保存所有注释元数据。
  2. 计时器服务定期运行以遍历JNDI树,以找到所有代理对象/远程服务。(需要计时器服务,因为weblogic在扩展发现运行时没有可用的JNDI条目。(
  3. 使用服务注释元数据将它们"匹配"到候选JNDI URL。基于文本的匹配基于全局便携式JNDI名称的信息
  4. 使用代理对象classLoader加载实现类以检查其方法注释数据,以查看是否是预期服务(由于代理类方法不包含任何注释元数据,因此需要加载类(
  5. 重复过程,直到所有服务都具有匹配的jndi。

在某些边缘情况下,该匹配项不起作用,但是对于那些边缘情况,我创建了另一个可以在硬编码的服务类中提供的注释,该注释是预期的JNDI路径,因此我们不必搜索。

这种方法在Wildfly和Weblogic中都起作用。

最新更新