ActiveMQ Artemis我可以通过选择器浏览消息,但不能接收



我有一个奇怪的问题,我们使用ActiveMQ Artemis 2.18.0和Artemis -jms-client-all:2.18.0作为客户端依赖。我们可以通过选择器JMSMessageID='some-id'浏览消息,但不能通过MessageConsumer接收消息。下面是表示这个问题的代码(我得到IllegalStateException("receive== null"))。如何调试这个问题?在100,000条消息中大约有30条会发生这种情况

Connection connection = null;
Session session = null;
String selector = "JMSMessageID='" + id + "'";
try {
connection = activeMQJMSConnectionFactory.createConnection();
session = connection.createSession(true, Session.SESSION_TRANSACTED);
Queue deadQueue = session.createQueue("hospital");
connection.start();
QueueBrowser browser = session.createBrowser(deadQueue, selector);
Enumeration e = browser.getEnumeration();
int foundedElements = 0;
while (e.hasMoreElements()) {
Message message = (Message) e.nextElement();
foundedElements++;
}
browser.close();
if (foundedElements != 1) {
throw new IllegalStateException("foundedElements!=1");
}
MessageConsumer messageConsumer = session.createConsumer(deadQueue, selector);
Message receive = messageConsumer.receive(1000);
if (receive == null) {
throw new IllegalStateException("receive== null");
}
messageConsumer.close();
session.commit();
session.close();
} catch (Exception e) {
try {
session.rollback();
session.close();
} catch (JMSException e1) {
e1.printStackTrace();
}
throw new RuntimeException(e);
} finally {
if (connection != null) {
try {
connection.close();
} catch (JMSException e) {
throw new RuntimeException(e);
}
}
}

接收返回与browse相同的消息。

我拿了你的代码并更新了一下,试图在ActiveMQ Artemis 2.18.0上重现问题,但每次都成功:

final String MESSAGE = "This is a text message";
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
try (Connection connection = connectionFactory.createConnection()) {
Session session = connection.createSession(true, Session.SESSION_TRANSACTED);
Queue deadQueue = session.createQueue("hospital");
connection.start();
MessageProducer mp = session.createProducer(deadQueue);
Message m = session.createTextMessage(MESSAGE);
mp.send(m);
session.commit();
String selector = "JMSMessageID='" + m.getJMSMessageID() + "'";
QueueBrowser browser = session.createBrowser(deadQueue, selector);
Enumeration e = browser.getEnumeration();
int foundedElements = 0;
while (e.hasMoreElements()) {
e.nextElement();
foundedElements++;
}
browser.close();
if (foundedElements != 1) {
throw new IllegalStateException("foundedElements != 1");
}
MessageConsumer messageConsumer = session.createConsumer(deadQueue, selector);
Message receive = messageConsumer.receive(1000);
if (receive == null) {
throw new IllegalStateException("receive == null");
} else if (!((TextMessage)receive).getText().equals(MESSAGE)) {
throw new IllegalStateException("messages don't match");
}
messageConsumer.close();
session.commit();
session.close();
} catch (Exception e) {
throw new RuntimeException(e);
}

我正在使用核心JMS客户端库。

然而,当我切换到OpenWire时JMS库代码失败。如果您还在使用OpenWire JMS客户机,那么我相信您正在访问ARTEMIS-3916。在这种情况下,我建议您要么将正在使用的JMS实现更改为核心JMS客户机,要么将代理升级到至少2.25.0,尽管如果升级到最新版本将更理想。

相关内容

最新更新