提问者:小点点

在JBoss中以编程方式暂停ActiveMQ Artemis队列EAP


我们将JBossEAP7.3与嵌入式ActiveMQ Artemis消息代理一起使用。我有一个需要以编程方式暂停队列的用例。我在本问题的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的名称。我确实看到一些名称中包含actiemq,但它们看起来像队列/地址的JBoss配置。

知道我可能做错了什么吗?


共1个答案

匿名用户

我想通了。我使用JConsole查看了所有MBean及其相关操作。我找到了一个引用myQueue(尽管不是jms. quue.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();