2016-04-14 14 views
1

こんにちは、私は次のソースコードを実行し、簡単なテストシナリオのいくつかの種類を書いています:ここで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プロバイダの同じ観測を持っているので、私の質問は、特定のプロバイダよりも概念です。

答えて

2

いいえ、仕様がreceiveNoWaitへの呼び出しがメッセージを返すことを保証するものではありません、それは可能性があり、その後、再び、それはないかもしれません。 receiveNoWaitを使用する場合は、必ずヌルリターンをチェックし、それに応じて行動する必要があります。ブローカーはそれに1を派遣しており、それがそうでなければそれだけでnullを返し、消費者のプリフェッチ・バッファですぐに利用可能である場合

のActiveMQの場合、クライアントは、メッセージを返します。

他の実装私は本当にブローカにポーリングリクエストを送信します。たとえば、Qpid JMSはAMQPリンクドレイン要求を使用して、ブローカがディスパッチ可能なメッセージを送信し、ブローカがそのメッセージを送信するか、リンクが排水され、準備ができているメッセージはありません。

要するに、クライアントとブローカーがreceiveNoWaitをどのように実装するのかはまったく問題ですが、その方法から返されるメッセージを受け取らない可能性を常に考慮する必要があります。

+0

あなたの答えティムいただきありがとうございます。私の理解は同じですが、私は仕様の適切な説明の欠如のために、より多くの意見を検索することに決めました。 – Altair

+0

参考までに、この[Message.receiveNoWait()の動作の仕組みを明確にする](https://java.net/jira/browse/JMS_SPEC-85)の標準に対する未解決のバグレポートが残っています。 – user7610

関連する問題