Exemplo n.º 1
0
        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;
            }
        }
Exemplo n.º 2
0
        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;
            }
        }
Exemplo n.º 3
0
        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);
            }
        }
Exemplo n.º 4
0
        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);
            }
        }
Exemplo n.º 5
0
        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();
            }
        }
Exemplo n.º 6
0
        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();
            }
        }