【问题标题】:Syntax for selecting messages by Jms ID按 Jms ID 选择消息的语法
【发布时间】:2013-05-12 19:14:01
【问题描述】:

根据相应的 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;
}

【问题讨论】:

  • JMSMessageID 的格式是特定于供应商的。您是否尝试查看 ActiveMQ 的格式是什么?
  • 怎么了?您发送的文件根本没有提及格式。尝试使用完全没有选择器的消息并打印属性JMSMessageID
  • JMS ID 是通过队列浏览器获取的,队列浏览器根据一些标准选择消息,然后使用:msg.getJMSMessageID() 提取,所以格式应该没问题。语法似乎也与我在这里看到的相符:bitbucket.org/mirror/activemq/src/…
  • 你的其他代码一定有问题。该选择器真的没问题(假设您的队列中有这样的消息ID)。你记得在阅读之前启动连接吗?

标签: java jms activemq message-queue


【解决方案1】:

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

更正的代码:

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

【讨论】:

    猜你喜欢
    • 2012-09-08
    • 2015-06-16
    • 2012-02-03
    • 2021-04-17
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    相关资源
    最近更新 更多