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