2017-04-20 66 views
0

我有一個函數,檢查它是否經常檢查我的服務總線中是否仍有消息。服務總線messagecount檢查返回true,即使它是0

是可以獲得ammount的功能是:

public int GetActiveMessageCount() 
    { 
     var connectionString = azureConnectionStringWithoutEntityPath; 
     long messageCount = 0; 
     try 
     { 
      var nameSpaceManager = NamespaceManager.CreateFromConnectionString(connectionString); 
      messageCount = nameSpaceManager.GetQueue(azureQueueName).MessageCountDetails.ActiveMessageCount; 
     } 
     catch 
     { 
      throw; 
     } 

     return (int)messageCount; 
    } 

而且檢驗結果是:

public bool MessageCountBiggerThenZero() 
    { 
     int messageCount = 0; 
     try 
     { 
      messageCount = this.GetActiveMessageCount(); 
     } 
     catch (Exception e) 
     { 
      Debug.WriteLine("An error occured while checking if the messageValue is bigger then zero and not null saying : " + e); 
     } 
     return messageCount > 0; 
    } 

這完全在剛開始的時候有爲零的消息,但啓動後收到的郵件,然後傳遞最後一個消息,它仍然通過MessageCountBiggerThenZero檢查。

有誰知道這可能是怎麼回事? serviceBus在最後一條消息之後是否返回其他值?

編輯:

更深入地瞭解檢查(所以它仍然通過if語句,即使沒有消息了):

public object RecieveOneMessageFromServiceBus() 
    { 
     var client = QueueClient.CreateFromConnectionString(azureConnectionString); 
     BrokeredMessage brokermessage = null; 
     client.PrefetchCount = 1; // get 1 message at a time 
     if (MessageCountBiggerThenZero()) 
     { 
      try 
      { 
       // try to recieve message 
      } 
      catch 
      { 
       throw; 
      } 
     } 
     else 
     { 
      return null; 
     }  
    } 
+0

你在哪裏調用'MessageCountBiggerThenZero'方法,你可以提供有關接收消息並調用MessageCountBiggerThenZero檢查代碼? –

+0

@ Bruce-MSFT我將代碼添加到問題中。我在其他地方也使用它,但他們有相同的結果。 – Tvt

回答

0

好吧,我似乎已經修復它,但我不知道如何以及爲什麼。我確實按照布魯斯的說法來實施它,但這不起作用。也許完整的方法是不發送速度不夠快或別的東西會之一,但現在我改變了我的接收方法來接收和刪除,並增加了一個定時器用於獲取的約5秒鐘的消息,如:

var client = QueueClient.CreateFromConnectionString(azureConnectionString,ReceiveMode.ReceiveAndDelete); 

brokermessage = client.Receive(TimeSpan.FromSeconds(5)); 

有了這個代碼它似乎工作,任何人都能解釋我爲什麼會非常想要。

編輯:

見下面的評論對額外解釋如何實現這更好

+0

'RecieveOneMessageFromServiceBus'方法是否可以在多線程中運行?我假定在調用'complete'之前,有一個實例調用'MessageCountBiggerThenZero'在另一個實例中以'PeekLock'模式接收到最後一條消息時進行檢查。我寧願使用'QueueClient.OnMessage'來接收隊列消息。 –

+0

正確。這可能是它。之後會更改代碼以適應我的需求。 – Tvt

+0

由於我的答覆無法重現此問題,因此您可以更新您的答案並提供更多詳細信息,並將其標記爲可能會遇到同一問題的其他社區的可接受答案。 –

0

根據你的代碼,我認爲你不調用BrokeredMessage.Complete,這可能會在處理完消息後將消息標記爲已處理和刪除。我修改了代碼,並添加日誌如下打印當前活動的消息:

public static object RecieveOneMessageFromServiceBus() 
{ 
    var client = QueueClient.CreateFromConnectionString(azureConnectionString); 
    client.PrefetchCount = 1; // get 1 message at a time 
    if (MessageCountBiggerThenZero()) 
    { 
     try 
     { 
      Console.WriteLine("begin retrieving a message..."); 
      var message = client.Receive(); 
      Console.WriteLine($"received message with MessageId:{message.MessageId}"); 

      //after receive the message for handling 
      Console.WriteLine($"after received a message in processing, active messages count:{GetActiveMessageCount()}"); 

      //after handled the message 
      message.Complete(); 

      Console.WriteLine($"invoke message.Complete() to complete the received message"); 

      //after receive the message for handling 
      Console.WriteLine($"after Complete() the message, active messages count:{GetActiveMessageCount()}"); 
     } 
     catch 
     { 
      throw; 
     } 
    } 
    return null; 
} 

enter image description here

此外,您可以登錄到Azure的門戶網站和的概述下檢查活動消息COUNT您服務總線隊列如下:

enter image description here

此外,你可以按照官方教程的Receive messages from the queue與請自行檢查當前的活動消息,也可以參考此issue

+0

嘿布魯斯不幸的是我把它標記爲完整。正如我所說的,一切都很完美,直到我完成最後一條消息。在那一刻,例如,我讀了40條消息,沒有發現任何問題,但是當我到達0活動消息時,MessageCountBiggerThenZero()函數仍然表示在那裏有一條消息,指示一個真正的布爾值 – Tvt

+0

在完成最後一條消息之後, Azure門戶上的** ACTIVE MESSAGE COUNT **? –

+0

是的,函數也立即做到這一點:this.GetActiveMessageCount(); – Tvt