2013-11-28 42 views
7

我正在使用Service Bus 2.1對於Windows Server,並且我有一種異步接收消息的方法。對於Windows服務器的服務總線2.1 - EndReceive方法上的TimeOutException

我的方法的主體是:

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(); 

既然我已經更新了DLL Microsoft.ServiceBus到2.1版,我有充分秒兩種例外情況(我用的是1.8版和2.0版之前):

類型的第一個機會異常「System.ServiceModel.FaultException`1」發生在Microsoft.ServiceBus.dll 型「System.TimeoutException」的第一次機會異常出現在Microsoft.ServiceBus.dll

的誰引發異常的方法有: 的「EndReceive」和Microsoft.ServiceBus.Messaging.Sbmp.DuplexRequestBindingElement.DuplexRequestSessionChannel.ThrowIfFaultMessage(消息wcfMessage)

我看到的互聯網,但沒有任何回答一些職位。 有人已經有這個問題?

+0

我在WSB應用程序的調試過程中看到了同樣的情況。 –

回答

1

我有與Servicebus庫2.05版本相同的問題。我更新到3.0,它解決了這個問題。

相關問題