Exemple #1
0
        private Message BuildMsmqMessage(Int32 command, string descriptor, object message,
                                         IMessageEndpoint responseEndpoint, TimeSpan?timeToLive)
        {
            if (responseEndpoint != null && !(responseEndpoint is MsmqMessageEndpoint))
            {
                throw new NotSupportedException("MSMQ endpoints can only talk to each other!");
            }

            MessageQueue responseQueue = null;

            var msmqResponseEndpoint = responseEndpoint as MsmqMessageEndpoint;

            if (msmqResponseEndpoint != null)
            {
                responseQueue = msmqResponseEndpoint.MessageQueue;
            }

            var msmqMessage = new Message
            {
                AppSpecific   = (int)command,
                Body          = message,
                Formatter     = (IMessageFormatter)MessageFormatter.Clone(),
                Label         = descriptor,
                Recoverable   = true,
                ResponseQueue = responseQueue,
            };

            if (timeToLive.HasValue)
            {
                msmqMessage.TimeToBeReceived = timeToLive.Value;
            }
            return(msmqMessage);
        }
Exemple #2
0
        private void QueuePeekCompleted(object sender, PeekCompletedEventArgs e)
        {
            var messageQueue = (MessageQueue)sender;

            messageQueue.EndPeek(e.AsyncResult);

            Message message = null;

            try
            {
                message = messageQueue.Receive();

                if (message == null)
                {
                    throw new InvalidOperationException("Null message");
                }

                message.Formatter = (IMessageFormatter)MessageFormatter.Clone();

                Trace.WriteLine(string.Format("Received message {0}", message.Id));

                var command = (Int32)message.AppSpecific;

                var handlers = _messageHandlers
                               .Where(x => x.Key == command)
                               .Select(x => x.Value)
                               .Where(x => x != null)
                               .ToArray();

                var handlerCount = handlers.Count();

                Trace.WriteLine(string.Format("Executing {0} handlers", handlerCount));

                if (!handlers.Any())
                {
                    handlers = new Action <object>[] { msg => Trace.TraceWarning("Message {0} has no registered handlers", message.Id) }
                }
                ;

                foreach (var handler in handlers)
                {
                    if (command == MessageCommand)
                    {
                        handler(message.Body);
                    }
                    else
                    {
                        handler(message);
                    }
                }
            }
            catch (Exception ex)
            {
                LogError(message, ex);
            }

            messageQueue.Refresh();
            messageQueue.BeginPeek();
        }