Search code examples
queuemessage-queuemulticastactivemq-artemis

How change routing type of ActiveMQ Artemis queue via core API


I'm using ActiveMQ Artemis 2.17.0. I want to change routing type exist queue via core API from Java client. I tried this:

...

    QueueSession session = createSession(connection)
    Message message = session.createMessage();
    final QueueConfiguration queueConfiguration = new org.apache.activemq.artemis.api.core.QueueConfiguration('testQueue');
            queueConfiguration.setRoutingType(org.apache.activemq.artemis.api.core.RoutingType.MULTICAST);
    queueConfiguration.setAddress('testQueue');
    queueConfiguration.setAutoCreateAddress(true);
            
    JMSManagementHelper.putOperationInvocation(message, 'testQueue', 'updateQueue', queueConfiguration.toJSON());
    Message reply = requestor.request(message);

I receive this error:

AMQ229069: no operation updateQueue/1

Also ClientSession has methods createQueue and deleteQueue but not updateQueue. How can I change a queue from the client API?


Solution

  • I found a solution. First, create an address with 2 routing-types, e.g.:

    ClientSession session ...
    ...
    session.createAddress(SimpleString.toSimpleString('testAddress'), EnumSet.allOf(RoutingType.class), false);
    

    Next, create queue with this address:

    final QueueConfiguration queueConfiguration = new QueueConfiguration('testQueue');
    queueConfiguration.setRoutingType(RoutingType.ANYCAST);
    queueConfiguration.setAddress('testAddress');
    queueConfiguration.setAutoCreateAddress(false);
    session.createQueue(queueConfiguration);
    

    and exactly at this queue can change routing type

    Queue managementQueue = session.createQueue(MANAGEMENT_QUEUE);
    requestor = new QueueRequestor(session, managementQueue);
    connection.start();
    Message message = session.createMessage();
    JMSManagementHelper.putOperationInvocation(message, 'broker', 'updateQueue', 'testQueue', 'MULTICAST', 2, false);
    
    Message reply = requestor.request(message);