你好我寫某種簡單的測試場景,我執行下面的源代碼:當消息可用時,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