将 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 个域范围的工作管理器:
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
at io.netty.util.collection.IntObjectHashMap.values(IntObjectHashMap.java:221)
问题:
- ActiveMQ 使用自定义工作管理器而不是默认工作管理器通常可以实现我的目标吗?
- 我通过修改
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。
我正在使用 ActiveMQ Artemis 2.13.0.redhat-00006 进行消息传递。我已经在 Weblogic 中部署了 ActiveMQ Artemis JCA RA。
我面临着对要从 Weblogic 执行的消息进行优先排序的要求。我想利用 Weblogic 提供的工作管理器概念。我在 Weblogic 中创建了 2 个域范围的工作管理器:
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
at io.netty.util.collection.IntObjectHashMap.values(IntObjectHashMap.java:221)
问题:
- ActiveMQ 使用自定义工作管理器而不是默认工作管理器通常可以实现我的目标吗?
- 我通过修改
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。