简体   繁体   中英

Pause an ActiveMQ Artemis Queue Programmatically in JBoss EAP

We're using JBoss EAP 7.3 with embedded ActiveMQ Artemis message broker. I have a use case where I need to programmatically pause a queue. The only complete example I found was here on Stack Overflow in this question .

His solution is the code shown below:

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

I tried to implement this solution. It is running in the same JBoss instance that the ActiveMQ Artemis broker is running in. I did change the code to look for my queue name ( jms.queue.myQueue ). I'm getting this exception below:

javax.management.InstanceNotFoundException: org.apache.activemq.artemis:broker="default",component=addresses,address="jms.queue.myQueue",subcomponent=queues,routing-type="anycast",queue="jms.queue.myQueue"

Unfortunately I don't know JMX at all. I wrote this code to get a list off all object names thinking maybe JBoss somehow changed the embedded ActiveMQ Artemis' default name:

Set mbeans = mBeanServer.queryNames(null, null);
for (Object mbean : mbeans)
{
    ObjectName objName = (ObjectName)mbean;
    logger.info(objName);
}

I'm not seeing any name with artemis in it. I do see some names with activemq in it but they look like the JBoss configuration of the queues / addresses.

Any idea what I might be doing wrong here?

I figured it out. I used JConsole to look at all the MBeans and their associated operations. I found one that references myQueue (although not jms.queue.myQueue ) and it had the "pause" operation. I changed that first line in the code to use that object name and it works.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM