コード例 #1
0
        void LoadQueues(Machine machine)
        {
            Task.Factory
            .StartNew(() =>
            {
                var privateQueues = MessageQueue.GetPrivateQueuesByMachine(machine.MachineName);

                return(privateQueues);
            })
            .ContinueWith(t =>
            {
                if (!t.IsFaulted)
                {
                    var queues = t.Result
                                 .Select(queue => new Queue(queue));

                    machine.SetQueues(queues);

                    return(NotificationEvent.Success("{0} queues loaded from {1}",
                                                     t.Result.Length,
                                                     machine.MachineName));
                }

                var details = t.Exception.ToString();
                return(NotificationEvent.Fail(details, "Could not load queues from {0}: {1}",
                                              machine.MachineName, t.Exception.Message));
            }, Context.UiThread)
            .ContinueWith(t => Messenger.Default.Send(t.Result), Context.UiThread);
        }
コード例 #2
0
ファイル: MsmqInteraction.cs プロジェクト: pegasy/RebusSnoop
        void LoadQueues(Machine machine)
        {
            Task.Factory
            .StartNew(() =>
            {
                var queues = MessageQueue
                             .GetPrivateQueuesByMachine(machine.MachineName)
                             .Concat(new[]
                {
                    // don't add non-transactional dead letter queue - wouldn't be safe!
                    //new MessageQueue(string.Format(@"FormatName:DIRECT=OS:{0}\SYSTEM$;DeadLetter", machine.MachineName)),

                    new MessageQueue(string.Format(@"FormatName:DIRECT=OS:{0}\SYSTEM$;DeadXact", machine.MachineName)),
                })
                             .ToArray();

                return(queues);
            })
            .ContinueWith(t =>
            {
                if (!t.IsFaulted)
                {
                    try
                    {
                        var queues = t.Result
                                     .Select(queue =>
                        {
                            try
                            {
                                return(new Queue(queue));
                            }
                            catch (Exception e)
                            {
                                throw new ApplicationException(string.Format("An error occurred while loading message queue {0}", queue.Path), e);
                            }
                        });

                        machine.SetQueues(queues);

                        return(NotificationEvent.Success("{0} queues loaded from {1}",
                                                         t.Result.Length,
                                                         machine.MachineName));
                    }
                    catch (Exception e)
                    {
                        return(NotificationEvent.Fail(e.ToString(), "Could not load queues from {0}: {1}",
                                                      machine.MachineName, e.Message));
                    }
                }

                return(NotificationEvent.Fail(t.Exception.ToString(), "Could not load queues from {0}: {1}",
                                              machine.MachineName, t.Exception.Message));
            }, Context.UiThread)
            .ContinueWith(t => Messenger.Default.Send(t.Result), Context.UiThread);
        }
コード例 #3
0
ファイル: MsmqInteraction.cs プロジェクト: pegasy/RebusSnoop
        void DownloadMessages(List <Message> messages)
        {
            Task.Factory
            .StartNew(() =>
            {
                // for now, just settle with using the desktop
                var directory = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);

                Func <int, string> getName = i => Path.Combine("Snoop Message Export", string.Format("export-{0}", i));
                var counter       = 1;
                var directoryName = getName(counter);
                while (Directory.Exists(Path.Combine(directory, directoryName)))
                {
                    directoryName = getName(++counter);
                }

                var directoryToSaveMessagesTo =
                    new DirectoryInfo(directory).CreateSubdirectory(directoryName);

                return(new
                {
                    Directory = directoryToSaveMessagesTo,
                    Messages = messages,
                    Success = true,
                    Exception = default(Exception),
                });
            })
            .ContinueWith(a =>
            {
                var result = a.Result;

                foreach (var message in result.Messages)
                {
                    File.WriteAllText(Path.Combine(result.Directory.FullName, GenerateFileName(message)),
                                      FormatMessage(message));
                }

                return(NotificationEvent.Success("Successfully downloaded {0} messages into {1}",
                                                 result.Messages.Count,
                                                 result.Directory));
            })
            .ContinueWith(a =>
            {
                if (a.Exception != null)
                {
                    Messenger.Default.Send(NotificationEvent.Fail(a.Exception.ToString(),
                                                                  "Something went wrong while attempting to download the messages"));

                    return;
                }

                Messenger.Default.Send(a.Result);
            }, Context.UiThread);
        }
コード例 #4
0
ファイル: MsmqInteraction.cs プロジェクト: pegasy/RebusSnoop
        void PurgeMessages(Queue queue)
        {
            var isOk = IsOkWithUser("This will delete all the messages from the queue {0} - press OK to continue...",
                                    queue.QueueName);

            if (!isOk)
            {
                return;
            }

            Task.Factory
            .StartNew(() =>
            {
                try
                {
                    using (var msmqQueue = new MessageQueue(queue.QueuePath))
                    {
                        msmqQueue.Purge();
                    }

                    return(new
                    {
                        Notification =
                            NotificationEvent.Success("Queue {0} was purged", queue.QueueName),
                        Success = true,
                    });
                }
                catch (Exception e)
                {
                    return(new
                    {
                        Notification = NotificationEvent.Fail(e.ToString(),
                                                              "Something went wrong while attempting to purge queue {0}",
                                                              queue.QueueName),
                        Success = false,
                    });
                }
            })
            .ContinueWith(r =>
            {
                var result = r.Result;

                Messenger.Default.Send(result.Notification);

                if (result.Success)
                {
                    Messenger.Default.Send(new QueuePurged(queue));
                }
            }, Context.UiThread);
        }
コード例 #5
0
ファイル: MsmqInteraction.cs プロジェクト: pegasy/RebusSnoop
        void DeleteQueue(Queue queue)
        {
            var isOk = IsOkWithUser("This will DELETE the queue {0} completely - press OK to continue...",
                                    queue.QueueName);

            if (!isOk)
            {
                return;
            }

            Task.Factory
            .StartNew(() =>
            {
                try
                {
                    MessageQueue.Delete(queue.QueuePath);

                    return(new
                    {
                        Success = true,
                        Notification = NotificationEvent.Success("Queue {0} was deleted", queue.QueueName)
                    });
                }
                catch (Exception e)
                {
                    return(new
                    {
                        Success = false,
                        Notification = NotificationEvent.Fail(e.ToString(),
                                                              "Something went wrong while attempting to delete queue {0}",
                                                              queue.QueueName),
                    });
                }
            })
            .ContinueWith(r =>
            {
                var result = r.Result;

                Messenger.Default.Send(result.Notification);

                if (result.Success)
                {
                    Messenger.Default.Send(new QueueDeleted(queue));
                }
            }, Context.UiThread);
        }
コード例 #6
0
ファイル: MsmqInteraction.cs プロジェクト: pegasy/RebusSnoop
        void LoadMessages(Queue queue)
        {
            Task.Factory
            .StartNew(() =>
            {
                var messageQueue = new MessageQueue(queue.QueuePath);
                messageQueue.MessageReadPropertyFilter = DefaultFilter();

                var list = new List <Message>();

                using (var enumerator = messageQueue.GetMessageEnumerator2())
                {
                    while (enumerator.MoveNext())
                    {
                        var message          = enumerator.Current;
                        var messageViewModel = GenerateMessage(message, queue.QueuePath);

                        messageViewModel.ResetDirtyFlags();

                        list.Add(messageViewModel);
                    }
                }

                return(new { Messages = list });
            })
            .ContinueWith(t =>
            {
                if (t.Exception == null)
                {
                    var result = t.Result;

                    queue.SetMessages(result.Messages);

                    return(NotificationEvent.Success("{0} messages loaded from {1}",
                                                     result.Messages.Count,
                                                     queue.QueueName));
                }

                var details = t.Exception.ToString();
                return(NotificationEvent.Fail(details, "Could not load messages from {0}: {1}",
                                              queue.QueueName,
                                              t.Exception));
            }, Context.UiThread)
            .ContinueWith(t => Messenger.Default.Send(t.Result), Context.UiThread);
        }
コード例 #7
0
ファイル: MsmqInteraction.cs プロジェクト: pegasy/RebusSnoop
        void MoveMessagesToSourceQueues(IEnumerable <Message> messagesToMove)
        {
            Task.Factory
            .StartNew(() =>
            {
                var canBeMoved = messagesToMove
                                 .Where(m => m.Headers.ContainsKey(Headers.SourceQueue));

                var result = new
                {
                    Moved  = new List <Message>(),
                    Failed = new List <Tuple <Message, string> >(),
                };

                foreach (var message in canBeMoved)
                {
                    try
                    {
                        MoveMessageToSourceQueue(message);
                        result.Moved.Add(message);
                    }
                    catch (Exception e)
                    {
                        result.Failed.Add(new Tuple <Message, string>(message, e.ToString()));
                    }
                }

                return(result);
            })
            .ContinueWith(t =>
            {
                var result = t.Result;

                if (result.Failed.Any())
                {
                    var details = string.Join(Environment.NewLine, result.Failed.Select(f => string.Format("Id {0}: {1}", f.Item1.Id, f.Item2)));

                    return(NotificationEvent.Fail(details, "{0} messages moved - {1} move operations failed", result.Moved.Count, result.Failed.Count));
                }

                return(NotificationEvent.Success("{0} messages moved", result.Moved.Count));
            })
            .ContinueWith(t => Messenger.Default.Send(t.Result), Context.UiThread);
        }
コード例 #8
0
ファイル: MsmqInteraction.cs プロジェクト: pegasy/RebusSnoop
        void DeleteMessages(List <Message> messages)
        {
            Task.Factory
            .StartNew(() =>
            {
                var result = new
                {
                    Deleted = new List <Message>(),
                    Failed  = new List <Tuple <Message, string> >(),
                };

                foreach (var messageToDelete in messages)
                {
                    try
                    {
                        DeleteMessage(messageToDelete);
                        result.Deleted.Add(messageToDelete);
                    }
                    catch (Exception e)
                    {
                        result.Failed.Add(new Tuple <Message, string>(messageToDelete, e.ToString()));
                    }
                }

                return(result);
            })
            .ContinueWith(t =>
            {
                var result = t.Result;

                if (result.Failed.Any())
                {
                    var details = string.Join(Environment.NewLine,
                                              result.Failed.Select(
                                                  f => string.Format("Id {0}: {1}", f.Item1.Id, f.Item2)));

                    return(NotificationEvent.Fail(details, "{0} messages deleted - {1} delete operations failed",
                                                  result.Deleted.Count, result.Failed.Count));
                }

                return(NotificationEvent.Success("{0} messages moved", result.Deleted.Count));
            })
            .ContinueWith(t => Messenger.Default.Send(t.Result), Context.UiThread);
        }
コード例 #9
0
ファイル: Queue.cs プロジェクト: snowattitudes/Rebus
        public Queue(MessageQueue queue)
            : this()
        {
            QueuePath = queue.Path;
            try
            {
                QueueName = queue.QueueName;
            }
            catch (Exception e)
            {
                if (queue.Path.ToLowerInvariant()
                    .Contains("deadxact"))
                {
                    QueueName    = "Dead-letter queue (TX)";
                    CanBeDeleted = false;
                }
                else
                {
                    Messenger.Default.Send(NotificationEvent.Fail(e.ToString(),
                                                                  "An error occurred while getting queue name for {0}: {1}",
                                                                  queue.Path, e.Message));
                    QueueName = QueuePath;
                }
            }

            try
            {
                MessageCount = (int)queue.GetCount();
            }
            catch (Exception e)
            {
                Messenger.Default.Send(NotificationEvent.Fail(e.ToString(),
                                                              "An error occurred while retrieving message count from {0}: {1}",
                                                              QueueName, e.Message));
                MessageCount = -1;
            }
        }
コード例 #10
0
ファイル: MsmqInteraction.cs プロジェクト: pegasy/RebusSnoop
        void MoveMessagesToQueue(List <Message> messagesToMove, bool shouldMoveMessages)
        {
            Task.Factory
            .StartNew(() => messagesToMove)
            .ContinueWith(t =>
            {
                var promptMessage =
                    string.Format("{0} {1} message(s) - please enter destination queue (e.g. 'someQueue@someMachine'): ",
                                  shouldMoveMessages ? "Moving" : "Copying", messagesToMove.Count);

                var destinationQueue = Prompt(promptMessage);

                return(new
                {
                    DestinationQueue = destinationQueue,
                    Messages = t.Result
                });
            }, Context.UiThread)
            .ContinueWith(t =>
            {
                var result = new
                {
                    Moved            = new List <Message>(),
                    Failed           = new List <Tuple <Message, string> >(),
                    DestinationQueue = t.Result.DestinationQueue,
                };

                if (string.IsNullOrEmpty(t.Result.DestinationQueue))
                {
                    result.Failed.AddRange(t.Result.Messages.Select(m => Tuple.Create(m, "No destination queue entered")));
                    return(result);
                }

                foreach (var message in t.Result.Messages)
                {
                    try
                    {
                        var leaveCopyInSourceQueue = !shouldMoveMessages;
                        MoveMessage(message, t.Result.DestinationQueue, leaveCopyInSourceQueue);
                        result.Moved.Add(message);
                    }
                    catch (Exception e)
                    {
                        result.Failed.Add(new Tuple <Message, string>(message, e.ToString()));
                    }
                }

                return(result);
            })
            .ContinueWith(t =>
            {
                var result = t.Result;

                if (result.Failed.Any())
                {
                    var details = string.Join(Environment.NewLine,
                                              result.Failed.Select(
                                                  f => string.Format("Id {0}: {1}", f.Item1.Id, f.Item2)));

                    return(NotificationEvent.Fail(details,
                                                  "{0} messages moved to {1} - {2} move operations failed",
                                                  result.Moved.Count, result.DestinationQueue,
                                                  result.Failed.Count));
                }

                return(NotificationEvent.Success("{0} messages moved to {1}", result.Moved.Count,
                                                 result.DestinationQueue));
            })
            .ContinueWith(t => Messenger.Default.Send(t.Result), Context.UiThread);
        }
コード例 #11
0
ファイル: MsmqInteraction.cs プロジェクト: pegasy/RebusSnoop
        void UpdateMessage(Message message, Queue queueToReload)
        {
            Task.Factory
            .StartNew(() =>
            {
                if (!message.CouldDeserializeBody)
                {
                    throw new InvalidOperationException(
                        string.Format(
                            "Body of message with ID {0} was not properly deserialized, so it's not safe to try to update it...",
                            message.Id));
                }

                using (var queue = new MessageQueue(message.QueuePath))
                {
                    queue.MessageReadPropertyFilter = LosslessFilter();
                    using (var transaction = new MessageQueueTransaction())
                    {
                        transaction.Begin();
                        try
                        {
                            var msmqMessage = queue.ReceiveById(message.Id, transaction);

                            var newMsmqMessage =
                                new System.Messaging.Message
                            {
                                Label     = msmqMessage.Label,
                                Extension = msmqMessage.Extension,

                                TimeToBeReceived   = msmqMessage.TimeToBeReceived,
                                UseDeadLetterQueue = msmqMessage.UseDeadLetterQueue,
                                UseJournalQueue    = msmqMessage.UseJournalQueue,
                            };

                            EncodeBody(newMsmqMessage, message);

                            queue.Send(newMsmqMessage, transaction);

                            transaction.Commit();
                        }
                        catch
                        {
                            transaction.Abort();
                            throw;
                        }
                    }
                }

                return(new
                {
                    Message = message,
                    Queue = queueToReload,
                    Notification =
                        NotificationEvent.Success("Fetched message with ID {0} and put an updated version back in the queue", message.Id),
                });
            })
            .ContinueWith(a =>
            {
                if (a.Exception != null)
                {
                    Messenger.Default.Send(NotificationEvent.Fail(a.Exception.ToString(),
                                                                  "Something went wrong while attempting to update message with ID {0}",
                                                                  message.Id));

                    return;
                }

                var result = a.Result;
                Messenger.Default.Send(new ReloadMessagesRequested(result.Queue));
                Messenger.Default.Send(result.Notification);
            }, Context.UiThread);
        }