java将ActiveMQResourceAdapter绑定到Weblogic中的自定义工作管理器
我正在使用ActiveMQ Artemis 2.13.0。用于消息传递的redhat-00006。我已经在Weblogic中部署了ActiveMQ Artemis JCA RA
我面临着对Weblogic中要执行的消息进行优先级排序的要求。我想利用Weblogic提供的工作经理概念。我在Weblogic中创建了两个域范围的工作管理器:
WorkManagerHighPriority
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)
问题:
- 通常是否可以实现我的目标,以便ActiveMQ使用自定义工作管理器而不是默认工作管理器李>
- 为了实现我的目标,我修改了
ActiveMQResourceAdapter.getWorkManager()
,这是否在正确的轨道上李>
# 1 楼答案
我认为这种方法最终不可行。如果您只是想在开发阶段将一些东西拼凑起来作为概念证明,那么这可能是有意义的,但是将ActiveMQ Artemis JCA资源适配器的定制补丁版本部署到一个或多个生产系统以获得企业级解决方案几乎肯定会在以后引起头痛
需要注意的是,ActiveMQ Artemis JCA RA在这里使用的
ctx
变量是一个javax.resource.spi.BootstrapContext
,它在RA启动时由容器(即Weblogic)提供给RA。RA使用这个BootstrapContext
从容器中获取工作管理器。因此,容器最终将向RA提供work manager实现。如果您想使用不同的工作经理,那么这就是需要进行更改的地方我对Weblogic知之甚少,但我认为它有一种方法可以配置这里使用的实际work manager实现。我建议您调查Weblogic提供的配置选项。如果一个容器允许多个工作管理器,而不提供一种方法将这些管理器提供给各种需要它们的JavaEE应用程序,那就没有多大意义
# 2 楼答案
我和Hingiswis在处理同一个问题。 我观察到,DenRa可能使用weblogic的workmanager将消息从队列中取出
但是看起来,RA总是在制作自己的线程来调用MDB,对吗?线程的名称类似于“ActiveMQ-client-factory-threads-316821716”,由ActiveMQThreadFactory创建
我没有找到配置RA的方法,因此它使用weblogic管理的workmanager中的线程来调用MDB