如何解决将 ActiveMQResourceAdapter 绑定到 Weblogic 中的自定义工作管理器
我使用 ActiveMQ Artemis 2.13.0.redhat-00006 进行消息传递。我已经在 Weblogic 中部署了 ActiveMQ Artemis JCA RA。
我面临着对要从 Weblogic 执行的消息进行优先级排序的要求。我想利用 Weblogic 提供的工作管理器概念。我在 Weblogic 中创建了 2 个域范围的工作经理:
formatted: 1050
WorkManagerHighPriority
我正在尝试修补 ActiveMQ,以便它使用我的自定义工作管理器(例如 WorkManagerLowPriority
),而不是默认工作管理器。我在 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
问题:
- 通常是否可以实现我的目标,以便 ActiveMQ 使用自定义工作管理器而不是默认工作管理器?
- 通过修改
"extendedStackTrace":"java.lang.NoClassDefFoundError: io/netty/util/collection/IntObjectHashMap$2 at io.netty.util.collection.IntObjectHashMap.values(IntObjectHashMap.java:221)
来实现我的目标,我是否走在正确的轨道上?
解决方法
我认为这种方法最终不可行。如果您只是想在开发阶段将某些东西组合在一起作为概念证明,那么这可能是有道理的,但是将 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 的工作管理器将消息从队列中取出。
但看起来,RA 总是在创建自己的线程来调用 MDB,对吗?线程的名称类似于“ActiveMQ-client-factory-threads-316821716”,由 ActiveMQThreadFactory 创建。
我发现无法配置 RA,因此它使用来自 weblogic 管理的工作管理器的线程来调用 MDB。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。