你好我写某种简单的测试场景,我执行下面的源代码:当消息可用时,JMS receiveNoWait()是否保证消息传递?
这里是我的send()方法:
public void send() throws JMSException {
Session session = null;
MessageProducer producer = null;
try {
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("TEST.FOO");
producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
byte[] uselessData = new byte[1024];
BytesMessage message = session.createBytesMessage();
message.writeBytes(uselessData);
producer.send(message);
} finally {
producer.close();
session.close();
}
}
这是我收到()方法:
public void receive() throws JMSException {
Session session = null;
MessageConsumer consumer = null;
try {
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("TEST.FOO");
consumer = session.createConsumer(destination);
Message hugeMessage = consumer.receiveNoWait();
if (hugeMessage == null) {
System.out.println("Message was not received");
unsucsesfullCount++;
} else {
if (hugeMessage instanceof BytesMessage) {
System.out.println("Message received");
}
}
} finally {
consumer.close();
session.close();
}
}
我执行:
send();
receive();
后receiveNoWait()总是空消息值。
我在这里的问题是receiveNoWait()保证消息传递时,在代理中的消息? send()已成功执行,因此目标中至少有一条消息。
我已经在规范中进行了搜索,但是如果在代理端可用的消息应该由客户端的receiveNoWait()明确地接收,则没有真正清晰的定义。
另外我想问一下,如果receiveNoWait()没有消息可用,它应该引发一些消费者刷新过程中的券商,因此,未来receiveNoWait()将收到消息?
我提供的示例代码在ActiveMQ上运行,但是我的问题比提供者更具概念性,因为我对其他JMS提供者有相同的观察。
感谢您的回答蒂姆。我的理解是一样的,但由于规范中缺乏适当的解释,我决定寻找更多意见。 – Altair
仅供参考,有一个针对此标准的旧的未解决的错误报告[澄清Message.receiveNoWait()如何表现](https://java.net/jira/browse/JMS_SPEC-85)。 – user7610