java - 通过 Jms ID 选择消息的语法

标签 java jms activemq message-queue

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

目前我使用:

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

上述语法适用于模拟代理的测试。但是对于 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;
}

最佳答案

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

更正的代码:

@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;
}

关于java - 通过 Jms ID 选择消息的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16612085/

相关文章:

java - poi shiftRows 调整大小并且不移动图像

java - 如何使用Quarkus指定要在application.properties中使用的基本docker镜像

java - 未应用 ActiveMQ 5.7.0 redeliveryPolicy

java - 如何使用curl命令在activemq主题中发布消息?

jms - 代理网络中的 ActiveMQ 消息传播

jms - 网络故障后重新连接到 ActiveMQ 服务器

java - 按 List 中的指定值对 ArrayList 进行排序

java - 并发消费者仍确保顺序

java - JMS 队列拆分。企业整合。 Apache Camel

java - 如何从 Spring @Query 注解调用 SQL 函数