【问题标题】:Bind ActiveMQResourceAdapter to custom Work Manager in Weblogic将 ActiveMQResourceAdapter 绑定到 Weblogic 中的自定义工作管理器
【发布时间】:2021-02-19 17:50:13
【问题描述】:

我正在使用 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() 来实现我的目标,我是否走在正确的轨道上?

【问题讨论】:

  • 你好 Justin,是的,我在 Weblogic 中有一个成功集成的 ActiveMQ,作为 rar depoymnt,它工作正常。我还配置了所有队列。它是 2.13.0.redhat-00006。我不知何故不知道应该从哪里开始修补 ActiveMQ 资源适配器。我确实从 Java EE 规范中获得了以下一般信息:部署资源适配器时,将调用 start() 方法。取消部署时,将调用 stop() 方法。资源适配器启动的任何工作都可以在 start() 方法中执行,就像使用 WebLogic Server 启动类一样。
  • 在ActiveMQResourceAdapter中可以找到启动方法,但是不知道资源适配器什么时候开始获取weblogic工作管理器。
  • 有趣的是,您已将其与 ActiveMQ Artemis 2.13.0 中的 JCA RA 一起使用,因为最近才添加了对管理对象的支持。有关详细信息,请参阅ARTEMIS-2903。
  • ActiveMQ Artemis JCA RA 通过使用javax.resource.spi.BootstrapContext.getWorkManager() 从容器中获取工作管理器。 BootstrapContext 实例由 Weblogic 通过 start() 方法提供给 RA。

标签: java weblogic weblogic12c activemq-artemis


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    我发现没有办法配置 RA,因此它使用来自 weblogic 管理的工作管理器的线程来调用 MDB。

    【讨论】:

    • 是的,好像不能让weblogic-threads在ActiveMQ中使用,因为ActiveMQ创建了自己的线程池来操作,这很好。但老实说,在应用服务器范围内使用 ActiveMQ,我觉得这不是最理想的,因为应用服务器应该是管理正在使用的线程的那个。也许这只适用于 weblogic。
    • 更准确地说,与此同时,我发现 ActiveMQResourceAdapter.java 不是针对需求修改的类。该类中使用的 Work manager 主要是在 RA 部署期间执行生命周期方法的初始调用,例如 activateEndpoint(...)。自己的线程池的创建在代理代码的其他地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 2020-06-12
    • 1970-01-01
    • 2016-01-25
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多