2016-04-14 106 views
1

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

回答

2

不,規範並不保證對receiveNoWait的任何調用都會返回一條消息,它可能會,然後又可能不會。使用receiveNoWait時,您必須始終檢查空歸還並相應採取行動。

在ActiveMQ的情況下,客戶端將返回一條消息,如果代理調度了一個消息,並且消費者預取緩衝區中立即可用,否則它只返回空值。

其他實現我確實向代理髮送了輪詢請求,例如Qpid JMS使用AMQP鏈接排空請求來請求代理髮送任何可用於分派的消息,代理將發送它們或發送信號鏈接被排空,沒有消息準備好。

簡而言之,它完全取決於客戶和經紀人如何實施receiveNoWait,但無論您總是需要考慮您無法從該方法返回給您的消息的機會。

+0

感謝您的回答蒂姆。我的理解是一樣的,但由於規範中缺乏適當的解釋,我決定尋找更多意見。 – Altair

+0

僅供參考,有一個針對此標準的舊的未解決的錯誤報告[澄清Message.receiveNoWait()如何表現](https://java.net/jira/browse/JMS_SPEC-85)。 – user7610