繁体   English   中英

将 ActiveMQResourceAdapter 绑定到 Weblogic 中的自定义工作管理器

[英]Bind ActiveMQResourceAdapter to custom Work Manager in Weblogic

我正在使用 ActiveMQ Artemis 2.13.0.redhat-00006 进行消息传递。 我已经在 Weblogic 中部署了 ActiveMQ Artemis JCA RA。

我面临的要求是优先考虑从 Weblogic 执行的消息。 我想利用 Weblogic 提供的工作管理器概念。 我在 Weblogic 中创建了 2 个域范围的工作管理器:

  1. WorkManagerHighPriority
  2. WorkManagerLowPriority

我正在尝试修补 ActiveMQ,以便它使用我的自定义工作管理器(例如WorkManagerLowPriority ),而不是默认的工作管理器。 我在ActiveMQResourceAdapter中找到了这个方法:

public WorkManager getWorkManager() {
    if (logger.isTraceEnabled()) {
        logger.trace("getWorkManager()");
    }

    if (ctx == null) {
        return null;
    }

    return ctx.getWorkManager();
}

在我天真的想法中,我将此方法修改为:

public WorkManager getWorkManager() {
    if (logger.isTraceEnabled()) {
        logger.trace("getWorkManager()");
    }

    InitialContext ic = null;
    WorkManager wm = null;
    try {
        Hashtable env = new Hashtable();
        // WebLogic Server 10.x/12.x connection details
        env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
        env.put(Context.PROVIDER_URL, "t3://localhost:28010");
        ic = new InitialContext(env);
        wm = (WorkManager) ic.lookup("java:comp/env/wm/WorkManagerLowPriority");
        if (wm == null) {
            throw new RuntimeException();
        }
    } catch (NamingException e) {
        e.printStackTrace();
    }
    return wm;
}

一切正常。 但是,在部署此补丁后,我收到以下错误:

"message": "Not an ActiveMQ Artemis Destination:ActiveMQQueue[online.eingabe.MyQueue]",
"name": "javax.jms.InvalidDestinationException",
"extendedStackTrace": "javax.jms.InvalidDestinationException: Not an ActiveMQ Artemis Destination:ActiveMQQueue

此外,我不断收到此警告:

"extendedStackTrace":"java.lang.NoClassDefFoundError: io/netty/util/collection/IntObjectHashMap$2
   at io.netty.util.collection.IntObjectHashMap.values(IntObjectHashMap.java:221)

问题:

  1. 通常是否可以实现我的目标,以便 ActiveMQ 使用自定义工作管理器而不是默认工作管理器?
  2. 通过修改ActiveMQResourceAdapter.getWorkManager()来实现我的目标,我是否走在正确的轨道上?

我不认为这种方法最终是可行的。 如果您只是想在开发阶段将某些东西作为概念证明进行破解,那么这可能是有道理的,但是将 ActiveMQ Artemis JCA 资源适配器的自定义补丁版本部署到一个或多个生产系统以实现企业级解决方案几乎肯定会在以后引起头痛。

需要注意的是,这里 ActiveMQ Artemis JCA RA 使用的ctx变量是一个javax.resource.spi.BootstrapContext ,它是由容器(即 Weblogic)在启动时提供给 RA 的。 RA 使用此BootstrapContext从容器中获取工作管理器。 因此,最终容器为 RA 提供了工作管理器实现。 如果您想使用不同的工作经理,那么就是需要进行更改的地方。

我对 Weblogic 知之甚少,但我想它有一种方法可以配置此处使用的实际工作管理器实现。 我建议您调查 Weblogic 提供的配置选项。 如果容器允许多个工作管理器而不提供一种方法来将这些工作管理器提供给需要它们的各种 Java EE 应用程序,那么它没有多大意义。

我正在研究与 hingiswiss 相同的问题。 我观察到,den RA 有可能使用 weblogic 中的 workmanager 将消息从队列中取出。

但似乎 RA 总是让自己的线程调用 MDB,对吗? 这些线程被命名为“ActiveMQ-client-factory-threads-316821716”,由 ActiveMQThreadFactory 创建。

我发现无法配置 RA,因此它使用来自 weblogic 管理的 workmanager 的线程来调用 MDB。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM