コード例 #1
0
        public void ReceiveMessage(SqlTransaction transaction)
        {
            Message message = null;

            try {
                message = ServiceBrokerWrapper.WaitAndReceive(transaction, this.ListenerQueue, waitTimeout);
            } catch (Exception e) {
                Logger.Error("Error in receiving message from queue.", e);
                throw; // Throw to rollback
            } finally {
                transactionWaitPool.Release(1);
                releasedWaitLock = true;
            }

            // No message? That's okay
            if (message == null)
            {
                return;
            }

            Guid conversationHandle = message.ConversationHandle;

            try {
                // Only handle transport messages
                if (message.MessageTypeName == NServiceBusTransportMessage)
                {
                    TransportMessage transportMessage = null;
                    try {
                        transportMessage = TransportMessageSerializer.Deserialize(message.BodyStream, true);
                    } catch (Exception ex) {
                        Logger.Error("Could not extract message data.", ex);
                        OnSerializationFailed(conversationHandle, message, ex);
                        return; // deserialization failed - no reason to try again, so don't throw
                    }

                    // Set the message Id
                    if (string.IsNullOrEmpty(transportMessage.Id))
                    {
                        transportMessage.Id = conversationHandle.ToString();
                    }

                    // Set the correlation Id
                    if (string.IsNullOrEmpty(transportMessage.IdForCorrelation))
                    {
                        transportMessage.IdForCorrelation = transportMessage.Id;
                    }

                    ProcessMessage(message, transportMessage);
                }
            } finally {
                // End the conversation
                ServiceBrokerWrapper.EndConversation(transaction, conversationHandle);
            }
        }
コード例 #2
0
 private void OnSerializationFailed(Guid conversationHandle, Message underlyingTransportObject, Exception exception)
 {
     try {
         TransportMessage transportMessage = null;
         try
         {
             transportMessage = TransportMessageSerializer.Deserialize(underlyingTransportObject.BodyStream, false);
         }
         catch (Exception)
         {
             // Eat this exception
         }
         this.WriteFailedMessage(conversationHandle, underlyingTransportObject, transportMessage, exception, 3);
         if (MessageFault != null)
         {
             MessageFault(this, new TransportMessageFaultEventArgs(transportMessage, exception, "SerializationFailed"));
         }
         SendFailureMessage(transportMessage, exception, "SerializationFailed");
     } catch (Exception e) {
         Logger.FatalFormat("Fault manager failed to process the failed message {0}", e, underlyingTransportObject);
         // TODO critical error will stop the transport from handling new messages
         //Configure.Instance.OnCriticalError();
     }
 }