2017-04-20 7 views
0

서비스 버스에 지속적으로 검사하는 메시지가 있는지 확인하는 기능이 있습니다.servicebus messagecount 검사는 0이더라도 true를 반환합니다.

액수를 얻을 기능은 다음과 같습니다

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; 
    } 

이 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' 메쏘드는 멀티 쓰레드에서 동작합니까? 나는 하나의 인스턴스가'MessageCountBiggerThenZero'를 호출한다고 가정하고,'complete'를 호출하기 전에 마지막 메시지가 다른 인스턴스에서'PeekLock' 모드로 수신되는 것으로 가정했습니다. 대기열 메시지를 받기 위해'QueueClient.OnMessage'를 사용하는 것을 선호합니다. –

+0

수정. 아마 그랬을거야. 나중에 내 필요에 맞게 코드를 변경합니다. – Tvt

+0

회신으로이 문제를 재현 할 수 없으므로 회신 내용을 더 자세히 업데이트하고 같은 문제가 발생할 수있는 다른 커뮤니티에 대한 대답으로 표시 할 수 있습니다. –

0

은 당신의 코드에 따르면, 난 당신이하지 않는 것으로 가정 BrokeredMessage.Complete을 호출하면 메시지를 처리 ​​한 것으로 표시 할 수 있으며 처리 한 후에 삭제할 수 있습니다. 난 당신의 코드를 수정하고 다음과 같이 현재 활성 메시지를 인쇄하려면 로그를 추가 : 푸른 포털에 로그인의 개요 아래 ACTIVE 메시지 수을 확인할 수 있습니다,

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

을 또한 서비스 버스 큐는 다음과 같이

enter image description here

또한,이 약 Receive messages from the queue을 공식 튜토리얼을 따라 수 너 자신이 현재 활성화 된 메시지를 확인하고, issue을 참조 할 수도있다.

+0

안녕하세요, 브루스는 불행히도 완성 된 것으로 표시합니다. 내가 말했듯이 마지막 메시지를 완성 할 때까지 모든 것이 완벽 해집니다.그 순간에 예를 들어 하나의 문제없이 40 개의 메시지를 읽었지만 0 개의 활성 메시지에 도달하면 MessageCountBiggerThenZero() 함수는 여전히 거기에 진정한 부울을 나타내는 메시지가 있다고 말합니다 – Tvt

+0

마지막 메시지를 완료 한 후 Azure 포털의 ** 활성 메시지 개수 **? –

+0

예 그리고이 함수는 this로 즉시 처리합니다 : this.GetActiveMessageCount(); – Tvt