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