2013-11-28 16 views
7

Service Server 2.1 kullanıyorum Windows Server için ve senkronize olmayan bir ileti alma yöntemim var.Service Bus 2.1 Windows Server için - EndReceive Yönteminde TimeOutException

yöntemimin organıdır:

sürüm 2.1 dll Microsoft.ServiceBus güncelledik yana
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(); 

, ben her saniye iki istisna var (ben sürüm 1.8 ve 2.0 kullanıyordum öncesi):

tip bir birinci şans özel 'System.ServiceModel.FaultException`1' Microsoft.ServiceBus.dll türü 'System.TimeoutException' bir birinci şans özel oluştu Microsoft.ServiceBus.dll

in oluştuistisna yükseltir yöntemler şunlardır: 'EndReceive' ve Microsoft.ServiceBus.Messaging.Sbmp.DuplexRequestBindingElement.DuplexRequestSessionChannel.ThrowIfFaultMessage (Mesaj wcfMessage)

internette ancak herhangi bir cevap vermeden bazı mesajları gördük. Birisi bu sorunu zaten aldı mı?

+0

WSB uygulamamın hata ayıklaması sırasında aynı şeyi görüyorum. –

cevap

1

Aynı sorun, 2.05 of Servicebus kitaplığı ile de vardı. 3.0'a güncelledim ve problemi çözdüm.

İlgili konular