java - 如何使用 JMS 和 CDI 1.2 查找 EJB

标签 java queue jms cdi wildfly-10

我正在将项目迁移到 Wildfly10 并使用 cdi-api 1.2

我一直在使用这个结构来获取beanManager,然后查找一些资源(例如EJB)。

import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.CDI;

public abstract class ServiceLocator {
    //....
    private BeanManager getBeanManager() throws NamingException {
        return CDI.current().getBeanManager();
    }
    public static <T> T lookup(Class<T> clazz) {
        BeanManager manager = this.getBeanManager(); 
    //...
}

这在Servlet过滤器中使用时效果很好。

但是,当我在 MDB JMS 中使用相同的函数时,例如:

@MessageDriven(mappedName = MyQueueProcessor.QUEUE_NAME, 
//...
public class RecebimentoMensagemCAM0021MDB {
    @Override
    protected void process(Object obj) {
        MyServices service = ServiceLocator.lookup(MyServices.class);
   //...

发生此异常:

java.lang.IllegalStateException: WFLYWELD0039: Singleton not set for 
ModuleClassLoader for Module "org.apache.activemq.artemis.ra:main" 
from local module loader @629f0666 (finder: local module finder 
@1bc6a36e (roots: /home/confidence/wildfly-
10.1.0.Final/modules,/home/confidence/wildfly-
10.1.0.Final/modules/system/layers/base)). This means that you are 
trying to access a weld deployment with a Thread Context ClassLoader 
that is not associated with the deployment.
    at org.jboss.as.weld.services.ModuleGroupSingletonProvider$TCCLSingleton.get(ModuleGroupSingletonProvider.java:77)
    at org.jboss.as.weld.services.ModuleGroupSingletonProvider$TCCLSingleton.get(ModuleGroupSingletonProvider.java:134)
    at org.jboss.weld.Container.instance(Container.java:55)
    at org.jboss.as.weld.WeldProvider.getCDI(WeldProvider.java:61)
    at javax.enterprise.inject.spi.CDI.current(CDI.java:60)
    at br.com.project.ServiceLocator.getBeanManager(ServiceLocator.java:xx)
    at br.com.project.ServiceLocator.lookup(ServiceLocator.java:xx)

任何人都可以帮助如何在 JMS 中进行此查找。

提前致谢。

最佳答案

您只需使用 CDI 即可获取服务实例,而无需使用定位器,例如:

MyServices myServices = CDI.select(MyServices.class).get()

http://docs.jboss.org/cdi/learn/userguide/CDI-user-guide.html#_obtaining_a_contextual_instance_by_programmatic_lookup

关于java - 如何使用 JMS 和 CDI 1.2 查找 EJB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46186719/

相关文章:

java - LWJGL 3 - 渲染文本

java - 具有超时的 invokeAll 和 InvokeAny 调用是否指定了 ThreadPoolExecutor 中配置的覆盖设置?

Laravel IronMQ 类未找到异常

.net - 多线程写入,从队列中读取一个线程,线程安全

ssl - SSLCipherSuite SSL_RSA_WITH_3DES_EDE_CBC_SHA 的 JMS 连接握手失败

java - 从 java 线程转移到 scala actor

java - 如何使用单独的 alpha 栅格创建 BufferedImage

c - 霍夫曼 C 无限循环

java - JMS/WMQ 可以同步消息传递吗?

java - 处理大量 JMS 消息类型