在 JBoss EAP 中以编程方式暂停 ActiveMQ Artemis 队列
Pause an ActiveMQ Artemis Queue Programmatically in JBoss EAP
我们正在使用 JBoss EAP 7.3 和嵌入式 ActiveMQ Artemis 消息代理。我有一个用例,我需要以编程方式暂停队列。我在 this question.
中的 Stack Overflow 上找到了唯一完整的示例
他的解决方案是如下所示的代码:
String eapObjectName = "org.apache.activemq.artemis:broker=\"default\",component=addresses,address=\"jms.queue.exampleQueue\",subcomponent=queues,routing-type=\"anycast\",queue=\"jms.queue.exampleQueue\"";
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName objectName = ObjectName.getInstance(eapObjectName);
QueueControl queueControl = MBeanServerInvocationHandler.newProxyInstance(mBeanServer,objectName,QueueControl.class,false)
queueControl.pause();
我尝试实施此解决方案。它在 ActiveMQ Artemis 代理 运行 所在的同一个 JBoss 实例中是 运行。我确实更改了代码以查找我的队列名称 (jms.queue.myQueue
)。我在下面收到此异常:
javax.management.InstanceNotFoundException: org.apache.activemq.artemis:broker="default",component=addresses,address="jms.queue.myQueue",subcomponent=queues,routing-type="anycast",queue="jms.queue.myQueue"
不幸的是我根本不知道 JMX。我编写这段代码是为了获取所有对象名称的列表,我想 JBoss 以某种方式更改了嵌入式 ActiveMQ Artemis 的默认名称:
Set mbeans = mBeanServer.queryNames(null, null);
for (Object mbean : mbeans)
{
ObjectName objName = (ObjectName)mbean;
logger.info(objName);
}
我没有看到任何包含 artemis
的名称。我确实看到一些名称带有 activemq
,但它们看起来像队列/地址的 JBoss 配置。
知道我这里可能做错了什么吗?
我明白了。我使用 JConsole 查看所有 MBean 及其相关操作。我找到了一个引用 myQueue
(虽然不是 jms.queue.myQueue
)并且它有“暂停”操作。我更改了代码中的第一行以使用该对象名称并且它有效。
String eapObjectName = "jboss.as:subsystem=\"messaging-activemq\",server=\"default\",jms-queue=\"myQueue\"";
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName objectName = ObjectName.getInstance(eapObjectName);
QueueControl queueControl = MBeanServerInvocationHandler.newProxyInstance(mBeanServer,objectName,QueueControl.class,false)
queueControl.pause();
我们正在使用 JBoss EAP 7.3 和嵌入式 ActiveMQ Artemis 消息代理。我有一个用例,我需要以编程方式暂停队列。我在 this question.
中的 Stack Overflow 上找到了唯一完整的示例他的解决方案是如下所示的代码:
String eapObjectName = "org.apache.activemq.artemis:broker=\"default\",component=addresses,address=\"jms.queue.exampleQueue\",subcomponent=queues,routing-type=\"anycast\",queue=\"jms.queue.exampleQueue\"";
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName objectName = ObjectName.getInstance(eapObjectName);
QueueControl queueControl = MBeanServerInvocationHandler.newProxyInstance(mBeanServer,objectName,QueueControl.class,false)
queueControl.pause();
我尝试实施此解决方案。它在 ActiveMQ Artemis 代理 运行 所在的同一个 JBoss 实例中是 运行。我确实更改了代码以查找我的队列名称 (jms.queue.myQueue
)。我在下面收到此异常:
javax.management.InstanceNotFoundException: org.apache.activemq.artemis:broker="default",component=addresses,address="jms.queue.myQueue",subcomponent=queues,routing-type="anycast",queue="jms.queue.myQueue"
不幸的是我根本不知道 JMX。我编写这段代码是为了获取所有对象名称的列表,我想 JBoss 以某种方式更改了嵌入式 ActiveMQ Artemis 的默认名称:
Set mbeans = mBeanServer.queryNames(null, null);
for (Object mbean : mbeans)
{
ObjectName objName = (ObjectName)mbean;
logger.info(objName);
}
我没有看到任何包含 artemis
的名称。我确实看到一些名称带有 activemq
,但它们看起来像队列/地址的 JBoss 配置。
知道我这里可能做错了什么吗?
我明白了。我使用 JConsole 查看所有 MBean 及其相关操作。我找到了一个引用 myQueue
(虽然不是 jms.queue.myQueue
)并且它有“暂停”操作。我更改了代码中的第一行以使用该对象名称并且它有效。
String eapObjectName = "jboss.as:subsystem=\"messaging-activemq\",server=\"default\",jms-queue=\"myQueue\"";
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName objectName = ObjectName.getInstance(eapObjectName);
QueueControl queueControl = MBeanServerInvocationHandler.newProxyInstance(mBeanServer,objectName,QueueControl.class,false)
queueControl.pause();