代码之家  ›  专栏  ›  技术社区  ›  Chris

确定javax中的JNDI可移植名称。企业注射spi。扩大

  •  1
  • Chris  · 技术社区  · 7 年前

    我正在实施 JCA inbound resource adapter 允许EIS向部署在Java EE应用服务器上的应用程序发送消息。

    只有用我的注释注释的EJB才可以访问,所以我使用了 javax.enterprise.inject.spi.Extension 为了观察 ProcessAnnotatedType 然后,我可以使用它存储部署在应用程序服务器上的所有用我的注释注释的EJB方法的详细信息。

    注释包含一个简短的唯一名称,该名称可以像逻辑服务名称一样使用,以允许来自EIS的入站调用。然后通过JNDI将这些调用调度到相应的端点。

    目前这一切都很好,但JNDI名称当前必须作为值提供在我的注释中。我想删除此要求,并让我的分机确定 Global Portable JNDI Name .

    由于我在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对象中,我或多或少可以计算出接口名称和企业bean名称,但应用程序名称和模块名称被证明更加难以捉摸。

    我试过使用 lookups of java:app/AppName and java:module/Module 名称当部署为时,这些工具可以很好地与wildfly(10.x)配合使用。战争,但在一年之内。ear由于某些原因,这些值不存在。在weblogic 12中。x无论部署存档类型如何,这些值都不存在。

    我正在寻找能够在任何符合Java EE的应用程序服务器上工作的东西,因此理想情况下不需要特定于应用程序服务器的依赖项。尽管情况更糟,但可以接受与weblogic和wildfly一起使用的东西。

    更新-wildfly日志:

    部署的应用程序与前面描述的不完全一样,我已经对它们进行了清理:

    休闲测试app-0.0.1。ear在应用程序中有一个自定义名称。xml“casual-test-app-custom-2”,其中包含测试ejb。jar和test-ejb2。罐子

    临时java测试应用程序。war是我可以让appName和moduleName工作的地方。

    休闲版-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 回复  |  直到 7 年前
        1
  •  0
  •   Tomaz Cerar    7 年前

    正如日志所述,您可以使用列出的任何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
  •  0
  •   Chris    6 年前

    我找到了几种不同的方法来实现这一点,但没有一种方法是完全理想的。最后,我们选择了解决方案2,因为这在我们需要支持的大多数场景中都有效。

    解决方案1-在需要时使用注释数据创建服务

    使用CDI BeanManager从SPI扩展注释元数据中发现的信息创建远程服务对象。这里有一些记录 section 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中的问题是由于weblogic bean管理器实现创建bean的方式;它不使用当前的线程类加载器,导致因未满足的依赖项或未找到类而出现异常。

    我也不完全满意每次都需要创建服务对象,因为slb缓存等的应用服务器设置将不受尊重。

    解决方案2-通过计时器服务遍历JNDI树执行延迟查找以查找匹配项

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

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

    这种方法适用于wildfly和weblogic。

    推荐文章