2013-11-28 6 views
7

サービスバス2.1を使用しています。Windows Serverの場合、メッセージを非同期で受信する方法があります。サービスバス2.1 Windows Serverの場合 - TimeOutException on EndReceiveメソッド

私のメソッドの本体は、次のとおりです。

var waitTimeout = TimeSpan.FromSeconds(10); 

     // Declare an action acting as a callback whenever a message arrives on a queue. 
     AsyncCallback completeReceive = null; 

     // Declare an action acting as a callback whenever a non-transient exception occurs while receiving or processing messages. 
     Action<Exception> recoverReceive = null; 

     // Declare an action responsible for the core operations in the message receive loop. 
     Action receiveMessage =() => 
     { 
      // Use a retry policy to execute the Receive action in an asynchronous and reliable fashion. 
      retryPolicy.ExecuteAction(
       (cb) => messageReceiver.BeginReceive(waitTimeout, cb, null), 
       (ar) => 
        { 
         // Make sure we are not told to stop receiving while we were waiting for a new message. 
         if (!cts.IsCancellationRequested) 
         { 
          // Complete the asynchronous operation. This may throw an exception that will be handled internally by retry policy. 
          BrokeredMessage msg = messageReceiver.EndReceive(ar); 

          // Check if we actually received any messages. 
          if (msg != null) 
          { 
           // Make sure we are not told to stop receiving while we were waiting for a new message. 
           if (!cts.IsCancellationRequested) 
           { 
            try 
            { 
             // Process the received message. 
             processMessage(msg); 

             // With PeekLock mode, we should mark the processed message as completed. 
             if (messageReceiver.Mode == ReceiveMode.PeekLock) 
             { 
              // Mark brokered message as completed at which point it's removed from the queue. 
              msg.SafeComplete(); 
             } 
            } 
            catch 
            { 
             // With PeekLock mode, we should mark the failed message as abandoned. 
             if (messageReceiver.Mode == ReceiveMode.PeekLock) 
             { 
              // Abandons a brokered message. This will cause Service Bus to unlock the message and make it available 
              // to be received again, either by the same consumer or by another completing consumer. 
              msg.SafeAbandon(); 
             } 

             // Re-throw the exception so that we can report it in the fault handler. 
             throw; 
            } 
            finally 
            { 
             // Ensure that any resources allocated by a BrokeredMessage instance are released. 
             msg.Dispose(); 
            } 
           } 
           else 
           { 
            // If we were told to stop processing, the current message needs to be unlocked and return back to the queue. 
            if (messageReceiver.Mode == ReceiveMode.PeekLock) 
            { 
             msg.SafeAbandon(); 
            } 
           } 
          } 
         } 

         // Invoke a custom callback method to indicate that we have completed an iteration in the message receive loop. 
         completeReceive(ar); 
        }, 
       () => 
        { 

        }, 
       (ex) => 
       { 
        // Invoke a custom action to indicate that we have encountered an exception and 
        // need further decision as to whether to continue receiving messages. 
        recoverReceive(ex); 
       }); 
     }; 

     // Initialize a custom action acting as a callback whenever a message arrives on a queue. 
     completeReceive = (ar) => 
     { 
      if (!cts.IsCancellationRequested) 
      { 
       // Continue receiving and processing new messages until we are told to stop. 
       receiveMessage(); 
      } 
     }; 

     // Initialize a custom action acting as a callback whenever a non-transient exception occurs while receiving or processing messages. 
     recoverReceive = (ex) => 
     { 
      if (!cts.IsCancellationRequested) 
      { 
       // Continue receiving and processing new messages until we are told to stop regardless of any exceptions. 
       receiveMessage(); 
      } 
     }; 

     // Start receiving messages asynchronously. 
     receiveMessage(); 

(私はバージョン1.8と2.0を使用していた前に)私は、バージョン2.1へのdll Microsoft.ServiceBusを更新しましたので、私はすべて秒に2つの例外があります。タイプの

最初のチャンス例外「System.ServiceModel.FaultException`1は」タイプ「System.TimeoutException」の最初の機会例外がMicrosoft.ServiceBus.dll

で発生Microsoft.ServiceBus.dll で発生しました例外を発生させる方法は以下のとおりです。 私は、インターネット上の任意の答えのないいくつかの記事を見てきました

「EndReceive」とMicrosoft.ServiceBus.Messaging.Sbmp.DuplexRequestBindingElement.DuplexRequestSessionChannel.ThrowIfFaultMessage(メッセージwcfMessage)。 誰かが既にこの問題を抱えていますか?

+0

WSBアプリのデバッグ中に同じことが起こっています。 –

答えて

1

バージョン2.05のServicebusライブラリと同じ問題がありました。私は3.0に更新し、問題を解決しました。

関連する問題