在 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();