こんにちは、私は次のソースコードを実行し、簡単なテストシナリオのいくつかの種類を書いています:ここでJMS receiveNoWait()は、メッセージが利用可能なときにメッセージ配信を保証しますか?
は私の送信である()メソッド:
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()ブローカーにメッセージがある場合、メッセージ配信を保証しますか?先に少なくとも1つのメッセージが存在するので、送信()が正常に実行されています。
私は仕様を検索しましたが、ブローカ側で利用可能なメッセージをクライアント側でreceiveNoWait()で明示的に受信する必要があるかどうかは明確に定義されていません。
また、私はreceiveNoWait()はそれがブローカーで、いくつかのリフレッシュ消費者のプロセスをトリガーする必要があり、メッセージが利用可能なので、次のreceiveNoWait(いない場合はメッセージが表示されます)、お聞きしたいですか?
のコード例Iは、ActiveMQの上の実行を提供しますが、私は他のJMSプロバイダの同じ観測を持っているので、私の質問は、特定のプロバイダよりも概念です。
あなたの答えティムいただきありがとうございます。私の理解は同じですが、私は仕様の適切な説明の欠如のために、より多くの意見を検索することに決めました。 – Altair
参考までに、この[Message.receiveNoWait()の動作の仕組みを明確にする](https://java.net/jira/browse/JMS_SPEC-85)の標準に対する未解決のバグレポートが残っています。 – user7610