通过Jms ID选择消息的语法

aks*_*mit 4 java activemq-classic jms message-queue

根据消息的相应JMS ID选择消息的正确语法是什么?

目前,我使用:

String selector = "JMSMessageID='ID:305:1:5:1:1'";
messageConsumer = session.createConsumer(getRetryQueue(), selector);
Run Code Online (Sandbox Code Playgroud)

上面的语法可以在模拟代理中进行测试。但是,对于ActiveMQ,不会轮询消息。

原始代码:

@Override
public Message readMessageFromRetryQueueByJmsId(String jmsId) throws QueueingException {
    Connection connection = null;
    Session session = null;
    MessageConsumer messageConsumer = null;
    Message message = null;
    try {
        connection = getConnectionFactory().createConnection();
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        messageConsumer = session.createConsumer(getRetryQueue(), "JMSMessageID='"+jmsId+"'");
        message = messageConsumer.receiveNoWait();
    } catch (JMSException e) {
        throw new QueueingException("Failed to read message from MessageConsumer.");
    } finally {
        try { messageConsumer.close(); } catch (Exception e) { /* NOP */ }
        try { session.close(); } catch (Exception e) { /* NOP */ }
        try { connection.close(); } catch (Exception e) { /* NOP */ }
    }
    return message;
}
Run Code Online (Sandbox Code Playgroud)

aks*_*mit 5

由于从未启动连接,因此未读取消息。

更正的代码:

@Override
public Message readMessageFromRetryQueueByJmsId(String jmsId) throws QueueingException {
    Connection connection = null;
    Session session = null;
    MessageConsumer messageConsumer = null;
    Message message = null;
    try {
        connection = getConnectionFactory().createConnection();
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        connection.start();
        messageConsumer = session.createConsumer(getRetryQueue(), "JMSMessageID='"+jmsId+"'");
        message = messageConsumer.receiveNoWait();
    } catch (JMSException e) {
        throw new QueueingException("Failed to read message from MessageConsumer.");
    } finally {
        try { connection.close(); } catch (Exception e) {}
    }
    return message;
}
Run Code Online (Sandbox Code Playgroud)