private void MoveToPoisonMessage(SqlTransaction transaction , ServiceBrokerMessage serviceBrokerMessage , IncomingTransportMessage transportMessage , Exception exception , string errorCode , int retries) { var origin_service_name = ""; if (transportMessage != null && transportMessage.Headers.ContainsKey(StandardHeaders.OriginatingAddress)) { origin_service_name = transportMessage.Headers[StandardHeaders.OriginatingAddress]; } else if (transportMessage != null && transportMessage.Headers.ContainsKey(StandardHeaders.ReplyToAddress)) { origin_service_name = transportMessage.Headers[StandardHeaders.ReplyToAddress]; } else { origin_service_name = ServiceBrokerWrapper.TryGetConversationFarService(transaction, serviceBrokerMessage.ConversationHandle); } var enqueuedDateTime = DateTime.MinValue; if (transportMessage != null && transportMessage.Headers.ContainsKey(StandardHeaders.TimeSent)) { DateTime.TryParse(transportMessage.Headers[StandardHeaders.TimeSent], out enqueuedDateTime); } try { PoisonMessageSqlHelper.WriteToPoisonMessageTable( transaction , serviceBrokerMessage.ConversationHandle , origin_service_name , enqueuedDateTime , ServiceBrokerService , ServiceBrokerQueue , serviceBrokerMessage.Body , MaxRetries , errorCode , exception); } catch (Exception e) { logger.Fatal(e, "Failed to write PoisonMessage for message {0} from queue {1}", serviceBrokerMessage.ConversationHandle, ServiceBrokerQueue); // suppress -- don't let this exception take down the process } PoisonMessageDetected?.Invoke(this, new PoisonMessageDetectedEventArgs() { MessageId = serviceBrokerMessage.ConversationHandle.ToString(), OriginServiceName = origin_service_name, ServiceName = this.ServiceBrokerService, QueueName = this.ServiceBrokerQueue, MessageBody = serviceBrokerMessage.Body, Retries = retries, ErrorCode = errorCode, Exception = exception, }); }
private void InitServiceBroker() { using (var connection = SqlServerTransactionManager.OpenConnection(ConnectionString)) using (var transaction = connection.BeginTransaction()) { // Ensure the service and queue exist ServiceBrokerWrapper.CreateServiceAndQueue(transaction, ServiceBrokerService, ServiceBrokerQueue, ServiceBrokerMessageType, ServiceBrokerContract); transaction.Commit(); connection.Close(); } PoisonMessageSqlHelper.EnsureTableExists(ConnectionString); }