2013-05-13 103 views
2

我們使用Azure服務總線隊列,並使用AcceptMessageSession(以下代碼)接收消息。服務總線MessageSession已接受,但接收返回null

接受MessageSession成功,但是當我在MessageSession上調用Receive時,返回null。

這不會一直髮生,而是會在創建隊列後的一段時間內發生。當發生這種情況時,我證實隊列不是空的。 當我關閉MessageSession我看到我的隊列縮短(!以正確的數量的消息),但我還沒有收到我的消息......

的代碼我使用:

public IEnumerable<T> ReceiveBatch<T>(TimeSpan waitTime) 
    { 
     MessageSession sessionReceiver = null; 
     IEnumerable<T> retval; 

     QueueClient queueClient = GetQueueClient<T>(); 

     try 
     { 
      sessionReceiver = queueClient.AcceptMessageSession(waitTime); 
      retval = ReceiveSessionMessages<T>(sessionReceiver); 
     } 
     finally 
     { 
      if (sessionReceiver != null) sessionReceiver.Close(); 
     } 

     return retval; 
    } 

    private IEnumerable<T> ReceiveSessionMessages<T>(MessageSession receiver) 
    { 
     receiver.PrefetchCount = 10; 

     BrokeredMessage message; 
     var retval = new List<T>(); 
     while ((message = receiver.Receive()) != null) 
     { 
      var item = message.GetBody<T>(); 
      if (!Equals(item, default(T))) retval.Add(item); 
     } 

     return retval; 
    } 

UPDATE:

我有一個懷疑,雖然某些會話的所有消息都已過期,但會話本身仍然存在,因此它被接受但沒有收到消息。

回答

0

幾個項目要考慮在這裏,您正在使用PrefetchCount做隱式批處理,而您可以使用RecieveBatch API顯式獲取一組消息。查看下面的代碼示例。

private IEnumerable<T> ReceiveSessionMessages<T>(MessageSession receiver) 
     { 
      var retval = new List<T>(); 
      var messages = receiver.ReceiveBatch(10); 
      foreach(BrokeredMessage message in messages) 
      { 
       var item = message.GetBody<T>(); 
       if (!Equals(item, default(T))) retval.Add(item); 
      } 

      return retval; 
     } 

同樣的情況下你得到一個MessageSession但沒有任何消息可以爲您詳細說明,如果他們可能已經過期?你是否設置了TimeToLive的值,或者在達到MaxDeliveryCount之後,這些消息會停止。

+0

感謝您的建議,我最初確實使用了RecieveBatch,它的工作方式與我沒有使用PrefetchCount集的情況相同。 TTL不是問題,deadlettering被打開,並且只有一個接收器。 – Ronnyle 2013-05-14 05:00:03

+0

你確定在GetBody調用中沒有錯誤嗎? – 2013-05-14 18:59:23

相關問題