2013-11-28 9 views
7

Utilizzo il bus di servizio 2.1 per Windows Server e ho un metodo per ricevere messaggi in modo asincrono.Service Bus 2.1 per Windows Server - TimeOutException sul metodo EndReceive

Il corpo del mio metodo è:

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

Da quando ho aggiornato il Microsoft.ServiceBus dll alla versione 2.1 (prima usavo la versione 1.8 e 2.0), ho ogni secondi due eccezioni:

Una prima eccezione di possibilità di tipo 'System.ServiceModel.FaultException`1' avvenuto in Microsoft.ServiceBus.dll Una prima eccezione di possibilità di tipo 'System.TimeoutException' verificato in Microsoft.ServiceBus.dll

L'metodi che solleva l'eccezione sono: Il 'EndReceive' e Microsoft.ServiceBus.Messaging.Sbmp.DuplexRequestBindingElement.DuplexRequestSessionChannel.ThrowIfFaultMessage (Messaggio wcfMessage)

Ho visto alcuni messaggi su internet, ma senza alcuna risposta. Qualcuno ha già questo problema?

+0

Sto vedendo la stessa cosa durante il debug della mia app WSB. –

risposta

1

Ho avuto lo stesso problema con la versione 2.05 della libreria di Servicebus. Ho aggiornato a 3.0 e ha risolto il problema.

Problemi correlati