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