按Jms ID选择消息的语法
根据相应的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; }