void HandleMessageFailedMaxNumberOfTimes(ReceivedTransportMessage receivedTransportMessage, string errorDetail) { var transportMessageToSend = receivedTransportMessage.ToForwardableMessage(); log.Warn("Message {0} is forwarded to error queue", transportMessageToSend.Label); transportMessageToSend.Headers[Headers.SourceQueue] = receiveMessages.InputQueueAddress; transportMessageToSend.Headers[Headers.ErrorMessage] = errorDetail; try { sendMessages.Send(errorTracker.ErrorQueueAddress, transportMessageToSend, GetTransactionContext()); } catch (Exception e) { log.Error(e, "Wanted to move message with id {0} to the error queue, but an exception occurred!", receivedTransportMessage.Id); // what to do? we need to throw again, or the message will not be rolled back and will thus be lost // - but we want to avoid thrashing, so we just log the badness and relax a little bit - that's // probably the best we can do Thread.Sleep(300); throw; } }
void HandleMessageFailedMaxNumberOfTimes(ReceivedTransportMessage receivedTransportMessage, string errorDetail) { var transportMessageToSend = receivedTransportMessage.ToForwardableMessage(); log.Warn("Message {0} is forwarded to error queue", transportMessageToSend.Label); transportMessageToSend.Headers[Headers.SourceQueue] = receiveMessages.InputQueueAddress; transportMessageToSend.Headers[Headers.ErrorMessage] = errorDetail; transportMessageToSend.Headers[Headers.Bounced] = ""; try { using (var txc = ManagedTransactionContext.Get()) { sendMessages.Send(errorTracker.ErrorQueueAddress, transportMessageToSend, txc.Context); } } catch (Exception e) { log.Error(e, "An error occurred while attempting to move message with id {0} to the error queue '{1}'", receivedTransportMessage.Id, errorTracker.ErrorQueueAddress); // what to do? we need to throw again, or the message will not be rolled back and will thus be lost // - but we want to avoid thrashing, so we just log the badness and relax a little bit - that's // probably the best we can do Thread.Sleep(TimeSpan.FromSeconds(1)); throw; } }
static void PossiblyCopyToAuditQueue(string auditQueueName, Exception exceptionOrNull, IBus bus, ReceivedTransportMessage message) { // if an error occurred, don't do anything if (exceptionOrNull != null) { return; } // this one will always be non-null - but still if (TransactionContext.Current == null) { log.Warn("Auditor called outside of a proper transaction context!!! This must be an error."); return; } var rebusBus = bus as RebusBus; if (rebusBus == null) { log.Warn("Current IBus is not a RebusBus, it's a {0} - cannot use {0} for auditing, sorry!", bus.GetType().Name); return; } using (var txc = ManagedTransactionContext.Get()) { var messageCopy = message.ToForwardableMessage(); messageCopy.Headers[Headers.AuditReason] = Headers.AuditReasons.Handled; messageCopy.Headers[Headers.AuditSourceQueue] = rebusBus.GetInputQueueAddress(); messageCopy.Headers[Headers.AuditMessageCopyTime] = RebusTimeMachine.Now().ToString("u"); rebusBus.InternalSend(new List <string> { auditQueueName }, messageCopy, txc.Context); var rebusEvents = rebusBus.Events as RebusEvents; if (rebusEvents == null) { log.Warn( "Current IRebusEvents is not a RebusEvents, it's a {0} - cannot use {0} for raising auditing events, sorry! (the message was properly audited though, it just turned out to be impossible to raise the MessageAudited event!)"); return; } rebusEvents.RaiseMessageAudited(rebusBus, messageCopy); } }
static void PossiblyCopyToAuditQueue(string auditQueueName, Exception exceptionOrNull, IBus bus, ReceivedTransportMessage message) { // if an error occurred, don't do anything if (exceptionOrNull != null) return; // this one will always be non-null - but still if (TransactionContext.Current == null) { log.Warn("Auditor called outside of a proper transaction context!!! This must be an error."); return; } var rebusBus = bus as RebusBus; if (rebusBus == null) { log.Warn("Current IBus is not a RebusBus, it's a {0} - cannot use {0} for auditing, sorry!", bus.GetType().Name); return; } using (var txc = ManagedTransactionContext.Get()) { var messageCopy = message.ToForwardableMessage(); messageCopy.Headers[Headers.AuditReason] = Headers.AuditReasons.Handled; messageCopy.Headers[Headers.AuditSourceQueue] = rebusBus.GetInputQueueAddress(); messageCopy.Headers[Headers.AuditMessageCopyTime] = RebusTimeMachine.Now().ToString("u"); rebusBus.InternalSend(new List<string> {auditQueueName}, messageCopy, txc.Context); var rebusEvents = rebusBus.Events as RebusEvents; if (rebusEvents == null) { log.Warn( "Current IRebusEvents is not a RebusEvents, it's a {0} - cannot use {0} for raising auditing events, sorry! (the message was properly audited though, it just turned out to be impossible to raise the MessageAudited event!)"); return; } rebusEvents.RaiseMessageAudited(rebusBus, messageCopy); } }
void HandlePost(HttpListenerResponse response, HttpListenerRequest request) { using (var reader = new BinaryReader(request.InputStream)) { var receivedTransportMessage = new ReceivedTransportMessage { Id = request.Headers[RebusHttpHeaders.Id], Body = reader.ReadBytes((int)request.ContentLength64) }; var headers = new Dictionary <string, string>(); foreach (var rebusHeaderKey in request.Headers.AllKeys.Where(k => k.StartsWith(RebusHttpHeaders.CustomHeaderPrefix))) { var value = request.Headers[rebusHeaderKey]; var key = rebusHeaderKey.Substring(RebusHttpHeaders.CustomHeaderPrefix.Length); headers.Add(key, value); } log.Info("Got headers in request: {0}", string.Join(", ", headers.Keys)); receivedTransportMessage.Headers = headers; log.Info("Received message {0}", receivedTransportMessage.Id); using (var queue = MsmqMessageQueue.Sender()) { queue.Send(destinationQueue, receivedTransportMessage.ToForwardableMessage()); } log.Info("Message was sent to {0}", destinationQueue); response.StatusCode = (int)HttpStatusCode.OK; response.Close(); } }
void HandlePost(HttpListenerResponse response, HttpListenerRequest request) { using (var reader = new BinaryReader(request.InputStream)) { var receivedTransportMessage = new ReceivedTransportMessage { Id = request.Headers[RebusHttpHeaders.Id], Body = reader.ReadBytes((int) request.ContentLength64) }; var headers = new Dictionary<string, string>(); foreach (var rebusHeaderKey in request.Headers.AllKeys.Where(k => k.StartsWith(RebusHttpHeaders.CustomHeaderPrefix))) { var value = request.Headers[rebusHeaderKey]; var key = rebusHeaderKey.Substring(RebusHttpHeaders.CustomHeaderPrefix.Length); headers.Add(key, value); } log.Info("Got headers in request: {0}", string.Join(", ", headers.Keys)); receivedTransportMessage.Headers = headers; log.Info("Received message {0}", receivedTransportMessage.Id); using (var queue = MsmqMessageQueue.Sender()) { queue.Send(destinationQueue, receivedTransportMessage.ToForwardableMessage()); } log.Info("Message was sent to {0}", destinationQueue); response.StatusCode = (int) HttpStatusCode.OK; response.Close(); } }