示例#1
0
 public static void ReturnMessageToSourceQueue(string errorQueueMachine, string errorQueueName, string msmqMessageId)
 {
     var path       = $@"{errorQueueMachine}\private$\{errorQueueName}";
     var errorQueue = new MessageQueue(path);
     {
         var messageReadPropertyFilter = new MessagePropertyFilter
         {
             Body             = true,
             TimeToBeReceived = true,
             Recoverable      = true,
             Id            = true,
             ResponseQueue = true,
             CorrelationId = true,
             Extension     = true,
             AppSpecific   = true,
             LookupId      = true,
         };
         errorQueue.MessageReadPropertyFilter = messageReadPropertyFilter;
         using (var scope = new TransactionScope())
         {
             var transactionType = MessageQueueTransactionType.Automatic;
             var message         = errorQueue.ReceiveById(msmqMessageId, TimeSpan.FromSeconds(5), transactionType);
             var fullPath        = ReadFailedQueueHeader(message);
             using (var failedQueue = new MessageQueue(fullPath))
             {
                 failedQueue.Send(message, transactionType);
             }
             scope.Complete();
         }
     }
 }
示例#2
0
        void ITransport.Start()
        {
            if (hasStarted)
            {
                return;
            }
            lock (startLock)
            {
                if (hasStarted)
                {
                    return;
                }

                InitQueue();

                if (ErrorQueue != null)
                {
                    errorQueue = new MessageQueue(MsmqUtilities.GetFullPath(ErrorQueue));
                }

                localQueue = new MessageQueue(MsmqUtilities.GetFullPath(InputQueue));
                var mpf = new MessagePropertyFilter();
                mpf.SetAll();
                localQueue.MessageReadPropertyFilter = mpf;

                if (MaxConcurrency > 0)
                {
                    Task.Factory.StartNew(LoopAndReceiveMessage, TaskCreationOptions.LongRunning);
                }
                hasStarted = true;
            }
        }
示例#3
0
        public IEnumerable <MessageDescriptor> Tail(string queue)
        {
            var messagePropertyFilter = new MessagePropertyFilter
            {
                ArrivedTime = true,
                Body        = true,
                Id          = true,
                Label       = true
            };


            var messageQueue = new MessageQueue(queue);

            messageQueue.MessageReadPropertyFilter = messagePropertyFilter;

            var messageEnumerator2 = messageQueue.GetMessageEnumerator2();

            while (true)
            {
                //arbitrary, 1 day.
                while (messageEnumerator2.MoveNext(TimeSpan.FromDays(1)))
                {
                    if (messageEnumerator2.Current == null)
                    {
                        continue;
                    }

                    yield return(CreateMessageDescriptor(messageEnumerator2.Current));
                }
            }
        }
        public void Init(Address address, bool transactional)
        {
            useTransactions = transactional;

            if (address == null)
            {
                throw new ArgumentException("Input queue must be specified");
            }

            var machine = address.Machine;

            if (machine.ToLower() != Environment.MachineName.ToLower())
            {
                throw new InvalidOperationException(string.Format("Input queue [{0}] must be on the same machine as this process [{1}].",
                                                                  address, Environment.MachineName.ToLower()));
            }

            myQueue = new MessageQueue(MsmqUtilities.GetFullPath(address));

            if (useTransactions && !QueueIsTransactional())
            {
                throw new ArgumentException("Queue must be transactional (" + address + ").");
            }

            var mpf = new MessagePropertyFilter();

            mpf.SetAll();

            myQueue.MessageReadPropertyFilter = mpf;

            if (PurgeOnStartup)
            {
                myQueue.Purge();
            }
        }
示例#5
0
        private static MessageQueue InitializeQueue(MessageQueue q)
        {
            bool transactional;

            try
            {
                transactional = q.Transactional;
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException(
                          string.Format("There is a problem with the input queue given: {0}. See the enclosed exception for details.", q.Path),
                          ex);
            }

            if (!transactional)
            {
                throw new ArgumentException("Queue must be transactional (" + q.Path + ").");
            }

            var mpf = new MessagePropertyFilter();

            mpf.SetAll();

            q.MessageReadPropertyFilter = mpf;
            return(q);
        }
示例#6
0
        /// <summary>
        /// Ppopulates the Message Browsing column list.
        /// </summary>
        private void SetupMessageBrowserPage()
        {
            //set up control properties
            messageBrowsingUpButton.Tag   = true;
            messageBrowsingDownButton.Tag = false;
            SetMessageBrowserListViewCommonProperties(messageBrowsingColumnsAvailableListView);
            SetMessageBrowserListViewCommonProperties(messageBrowsingColumnsSelectedListView);

            //load a list of message filter properties
            MessagePropertyFilter filter = new MessagePropertyFilter();

            PropertyInfo[] propertyInfoArray = filter.GetType().GetProperties();
            foreach (PropertyInfo property in propertyInfoArray)
            {
                if (!Utilities.IsStringInArray(Constants.MessageBrowserColumnExclusionList, property.Name))
                {
                    //create new available column list item
                    ListViewItem propertyListItem = new ListViewItem(property.Name);
                    messageBrowsingColumnsAvailableListView.Items.Add(propertyListItem);
                }
            }

            //auto select properties/columns according to user settings
            foreach (string columnName in _settings.MessageBrowserColumnListCollection)
            {
                foreach (ListViewItem checkItem in messageBrowsingColumnsAvailableListView.Items)
                {
                    if (checkItem.Text == columnName)
                    {
                        AddMessageBrowsingColumn(checkItem);
                        break;
                    }
                }
            }
        }
        public MsmqReturnJournalObserver()
        {
            _log = Log.For(this);

            _messagePropertyFilter = new MessagePropertyFilter();
            _messagePropertyFilter.SetAll();
        }
        public void SetUp(string queuePath)
        {
            if (string.IsNullOrEmpty(queuePath))
            {
                throw new ArgumentNullException();
            }

            bool msmqExist;

            try
            {
                msmqExist = MessageQueue.Exists(queuePath);
            }
            catch (InvalidOperationException)
            {
                msmqExist = true;
            }

            _messageQueue = !msmqExist
                                ? MessageQueue.Create(queuePath, false)
                                : new MessageQueue(queuePath, false, true, QueueAccessMode.Receive);

            _messageQueue.Formatter = new JsonGzipMessageFormatter <T>();
            var filter = new MessagePropertyFilter();

            filter.ClearAll();
            filter.Body = true;
            _messageQueue.MessageReadPropertyFilter = filter;
        }
        public void Connect()
        {
            Disconnect();

            _log.DebugFormat("Creating MessageQueue: " + _formatName);

            _queue = new MessageQueue(_formatName, _accessMode);
            if (_multicastAddress != null)
            {
                _queue.MulticastAddress = _multicastAddress;
            }

            //https://connect.microsoft.com/VisualStudio/feedback/details/736877/msmq-multicast-in-system-messaging
            // ReSharper disable EmptyGeneralCatchClause
            // ReSharper disable UnusedVariable
            try { var touch = _queue.FormatName; } catch { }
            // ReSharper restore UnusedVariable
            // ReSharper restore EmptyGeneralCatchClause


            var filter = new MessagePropertyFilter();

            filter.SetAll();
            _queue.MessageReadPropertyFilter = filter;
        }
        //**************************************************
        // Retrieves application-specific properties for a
        // Message.
        //**************************************************

        public void RetrieveSelectedProperties()
        {
            // Connect to a message queue.
            MessageQueue myQueue = new MessageQueue(".\\myQueue");

            // Specify to retrieve selected properties.
            MessagePropertyFilter myFilter = new
                                             MessagePropertyFilter();

            myFilter.ClearAll();
            // The following list is a random subset of available properties.
            myFilter.Body        = true;
            myFilter.Label       = true;
            myFilter.MessageType = true;
            myFilter.Priority    = true;
            myQueue.MessageReadPropertyFilter = myFilter;

            // Set the formatter for the Message.
            myQueue.Formatter = new XmlMessageFormatter(new Type[]
                                                        { typeof(String) });

            // Receive the first message in the queue.
            Message myMessage = myQueue.Receive();

            // Display selected properties.
            Console.WriteLine("Message type: " +
                              myMessage.MessageType.ToString());
            Console.WriteLine("Priority: " +
                              myMessage.Priority.ToString());

            return;
        }
        public MsmqReleaseMessageObserver()
        {
            _log = Log.For(this);

            _messagePropertyFilter = new MessagePropertyFilter();
            _messagePropertyFilter.SetAll();
        }
        public void Init()
        {
            lock (lockObj)
            {
                if (storageQueue != null)
                {
                    return;
                }

                var storageQueueAddress = configure.LocalAddress.SubScope("distributor.storage");
                var path = MsmqUtilities.GetFullPath(storageQueueAddress);
                var messageReadPropertyFilter = new MessagePropertyFilter
                {
                    Id            = true,
                    Label         = true,
                    ResponseQueue = true,
                };

                storageQueue = new MessageQueue(path, false, true, QueueAccessMode.SendAndReceive)
                {
                    MessageReadPropertyFilter = messageReadPropertyFilter
                };

                if ((!storageQueue.Transactional) && (configure.Settings.Get <bool>("Transactions.Enabled")))
                {
                    throw new Exception(string.Format("Queue [{0}] must be transactional.", path));
                }
            }
        }
示例#13
0
 public GxQueue(IGxContext context)
 {
     this.context     = context;
     this.queryString = "";
     propertyFilter   = new MessagePropertyFilter();
     propertyFilter.SetDefaults();
     propertyFilter.CorrelationId = true;
     propertyFilter.Priority      = true;
 }
示例#14
0
        public static uint GetCount(this MessageQueue queue)
        {
            var flags = new MessagePropertyFilter
            {
                AdministrationQueue = false,
                ArrivedTime         = false,
                CorrelationId       = false,
                Priority            = false,
                ResponseQueue       = false,
                SentTime            = false,
                Body                       = false,
                Label                      = false,
                Id                         = false,
                AcknowledgeType            = false,
                Acknowledgment             = false,
                AppSpecific                = false,
                AttachSenderId             = false,
                Authenticated              = false,
                AuthenticationProviderName = false,
                AuthenticationProviderType = false,
                ConnectorType              = false,
                DestinationQueue           = false,
                DestinationSymmetricKey    = false,
                DigitalSignature           = false,
                EncryptionAlgorithm        = false,
                Extension                  = false,
                HashAlgorithm              = false,
                IsFirstInTransaction       = false,
                IsLastInTransaction        = false,
                LookupId                   = false,
                MessageType                = false,
                Recoverable                = false,
                SenderCertificate          = false,
                SenderId                   = false,
                SenderVersion              = false,
                SourceMachine              = false,
                TimeToBeReceived           = false,
                TimeToReachQueue           = false,
                TransactionId              = false,
                TransactionStatusQueue     = false,
                UseAuthentication          = false,
                UseDeadLetterQueue         = false,
                UseEncryption              = false,
                UseJournalQueue            = false,
                UseTracing                 = false
            };

            var newQueue = new MessageQueue(queue.Path);

            newQueue.MessageReadPropertyFilter = flags;
            return((uint)newQueue.GetAllMessages()
                   .Length);
            //return GetCount(queue.Path);
        }
示例#15
0
        private MessagePropertyFilter GetMessageReadPropertyFilter()
        {
            var messagePropertyFilter = new MessagePropertyFilter();

            messagePropertyFilter.CorrelationId = true;
            messagePropertyFilter.Label         = true;
            messagePropertyFilter.AppSpecific   = true;
            messagePropertyFilter.Priority      = true;
            messagePropertyFilter.Extension     = true;

            return(messagePropertyFilter);
        }
示例#16
0
        private MessageQueue CreateGuardedQueue()
        {
            var messageQueue = new MessageQueue(path);

            var messagePropertyFilter = new MessagePropertyFilter();

            messagePropertyFilter.SetAll();

            messageQueue.MessageReadPropertyFilter = messagePropertyFilter;

            return(messageQueue);
        }
示例#17
0
        /// <summary>
        ///     Initializes the <see cref="IDequeueMessages" />.
        /// </summary>
        /// <param name="address">The address to listen on.</param>
        /// <param name="settings">The <see cref="TransactionSettings" /> to be used by <see cref="IDequeueMessages" />.</param>
        /// <param name="tryProcessMessage">Called when a message has been dequeued and is ready for processing.</param>
        /// <param name="endProcessMessage">
        ///     Needs to be called by <see cref="IDequeueMessages" /> after the message has been
        ///     processed regardless if the outcome was successful or not.
        /// </param>
        public void Init(Address address, TransactionSettings settings, Func <TransportMessage, bool> tryProcessMessage,
                         Action <TransportMessage, Exception> endProcessMessage)
        {
            this.tryProcessMessage = tryProcessMessage;
            this.endProcessMessage = endProcessMessage;
            transactionSettings    = settings;

            if (address == null)
            {
                throw new ArgumentException("Input queue must be specified");
            }

            if (!address.Machine.Equals(RuntimeEnvironment.MachineName, StringComparison.OrdinalIgnoreCase))
            {
                throw new InvalidOperationException(
                          string.Format("Input queue [{0}] must be on the same machine as this process [{1}].",
                                        address, RuntimeEnvironment.MachineName));
            }

            transactionOptions = new TransactionOptions
            {
                IsolationLevel = transactionSettings.IsolationLevel,
                Timeout        = transactionSettings.TransactionTimeout
            };

            queue = new MessageQueue(MsmqUtilities.GetFullPath(address), false, true, QueueAccessMode.Receive);

            if (transactionSettings.IsTransactional && !QueueIsTransactional())
            {
                throw new ArgumentException(
                          "Queue must be transactional if you configure your endpoint to be transactional (" + address + ").");
            }

            var messageReadPropertyFilter = new MessagePropertyFilter
            {
                Body             = true,
                TimeToBeReceived = true,
                Recoverable      = true,
                Id            = true,
                ResponseQueue = true,
                CorrelationId = true,
                Extension     = true,
                AppSpecific   = true
            };

            queue.MessageReadPropertyFilter = messageReadPropertyFilter;

            if (PurgeOnStartup)
            {
                queue.Purge();
            }
        }
示例#18
0
        private static void CheckNumberOfMessages(object state)
        {
            timer.Change(int.MaxValue, int.MaxValue);

            Stopwatch watch = new Stopwatch();

            watch.Start();

            List <ManagedEndpoint> myList;

            lock (typeof(Manager))
                myList = new List <ManagedEndpoint>(endpoints);

            foreach (ManagedEndpoint endpoint in myList)
            {
                MSMQ.MSMQManagementClass qMgmt = new MSMQ.MSMQManagementClass();
                object machine    = Type.Missing;
                object missing    = Type.Missing;
                object formatName = "DIRECT=OS:" + Environment.MachineName + "\\private$\\" + endpoint.Queue;

                try
                {
                    qMgmt.Init(ref machine, ref missing, ref formatName);
                    endpoint.SetNumberOfMessages(qMgmt.MessageCount);

                    MessageQueue q = new MessageQueue("FormatName:" + formatName as string);

                    MessagePropertyFilter mpf = new MessagePropertyFilter();
                    mpf.SetAll();

                    q.MessageReadPropertyFilter = mpf;

                    Message m = q.Peek();
                    if (m != null)
                    {
                        endpoint.AgeOfOldestMessage = DateTime.Now - m.SentTime;
                    }
                }
                catch
                {
                    //intentionally swallow bad endpoints
                }
            }

            watch.Stop();

            long due = refreshInterval * 1000 - watch.ElapsedMilliseconds;

            due = (due < 0 ? 0 : due);

            timer.Change(due, refreshInterval * 1000);
        }
示例#19
0
        internal static void SetPropertyFilter(this MessageQueue messageQueue)
        {
            // Specify which MSMQ Message properties to retrieve
            var messagePropertyFilter = new MessagePropertyFilter();

            messagePropertyFilter.ClearAll();
            messagePropertyFilter.Id               = true;
            messagePropertyFilter.CorrelationId    = true;
            messagePropertyFilter.Body             = true;
            messagePropertyFilter.Label            = true;
            messagePropertyFilter.SentTime         = true;
            messagePropertyFilter.AppSpecific      = true;
            messageQueue.MessageReadPropertyFilter = messagePropertyFilter;
        }
示例#20
0
        MessageQueue CreateMessageQueue(string path, bool createIfNotExists)
        {
            var messageQueue = GetMessageQueue(path, createIfNotExists);

            messageQueue.Formatter = new RebusTransportMessageFormatter();
            var messageReadPropertyFilter = new MessagePropertyFilter();

            messageReadPropertyFilter.Id           = true;
            messageReadPropertyFilter.Body         = true;
            messageReadPropertyFilter.Extension    = true;
            messageReadPropertyFilter.Label        = true;
            messageQueue.MessageReadPropertyFilter = messageReadPropertyFilter;
            return(messageQueue);
        }
示例#21
0
        MessageQueue GetMessageQueue(string path)
        {
            var queue        = new MessageQueue(path);
            var messageQueue = queue;

            messageQueue.Formatter = new RebusTransportMessageFormatter();
            var messageReadPropertyFilter = new MessagePropertyFilter();

            messageReadPropertyFilter.Id           = true;
            messageReadPropertyFilter.Body         = true;
            messageReadPropertyFilter.Extension    = true;
            messageReadPropertyFilter.Label        = true;
            messageQueue.MessageReadPropertyFilter = messageReadPropertyFilter;
            return(messageQueue);
        }
示例#22
0
        private MessageQueue GetJobResponseQueue()
        {
            Type[] rTtypes = new Type[] { typeof(FCoordsResult) };

            MessagePropertyFilter mpf = new MessagePropertyFilter
            {
                Body = true,
                //Id = true,
                CorrelationId = true
            };

            MessageQueue result = MqHelper.GetQ(INPUT_COORDS_Q_PATH, QueueAccessMode.Receive, rTtypes, mpf);

            return(result);
        }
示例#23
0
        private MessageQueue GetJobResponseQueue()
        {
            Type[] rTtypes = new Type[] { typeof(FJobResult) };

            MessagePropertyFilter mpf = new MessagePropertyFilter
            {
                Body = true,
                //Id = true,
                CorrelationId = true
            };

            MessageQueue result = MqHelper.GetQ(_inputQueuePath, QueueAccessMode.Receive, rTtypes, mpf);

            return(result);
        }
    public override void Main(string[] args)
    {
        _mq = new MessageQueue(@".\private$\my_queue", QueueAccessMode.Receive);
        _mq.ReceiveCompleted += new ReceiveCompletedEventHandler(_mq_ReceiveCompleted);
        _mq.Formatter         = new ActiveXMessageFormatter();
        MessagePropertyFilter filter = new MessagePropertyFilter();

        filter.Label                  = true;
        filter.Body                   = true;
        filter.AppSpecific            = true;
        _mq.MessageReadPropertyFilter = filter;
        this.DoReceive();
        Console.ReadLine();
        _mq.Close();
    }
        public static MessageQueue GetOrCreateMessageQueue(string name)
        {
            CheckedQueues.GetOrAdd(name, n =>
            {
                MsmqUtilities.CreateQueueIfNecessary(name);
                return(null);
            });

            var q      = new MessageQueue(MsmqUtilities.GetFullPath(name), false, true);
            var filter = new MessagePropertyFilter();

            filter.SetAll();
            q.MessageReadPropertyFilter = filter;
            return(q);
        }
示例#26
0
        public void Send(Message message, string destination)
        {
            destination = ".\\Private$\\" + destination;

            // create connection to destination queue
            MessageQueue destinationQueue = new MessageQueue(destination);

            // Set properties filter
            MessagePropertyFilter messagePropertyFilter = new MessagePropertyFilter();

            messagePropertyFilter.SetAll();
            destinationQueue.MessageReadPropertyFilter = messagePropertyFilter;

            // send message to destination
            destinationQueue.Send(message, GetTransactionTypeForSend());
        }
示例#27
0
        public void Connect()
        {
            Disconnect();

            _log.DebugFormat("Creating MessageQueue: " + _formatName);

            _queue = new MessageQueue(_formatName, _accessMode);
            if (_multicastAddress != null)
            {
                _queue.MulticastAddress = _multicastAddress;
            }

            var filter = new MessagePropertyFilter();

            filter.SetAll();
            _queue.MessageReadPropertyFilter = filter;
        }
示例#28
0
        public void mqSendToPoisonQueue(object message, MessagePriority priority)
        {
            try
            {
                if (message != null)
                {
                    if (MessageQueue.Exists(_poisonQueueName))
                    {
                        using (MessageQueue q = new MessageQueue(_poisonQueueName))
                        {
                            q.DefaultPropertiesToSend.Recoverable = true;
                            MessagePropertyFilter mf = new MessagePropertyFilter();
                            mf.SetAll();
                            mf.AppSpecific = true;
                            q.MessageReadPropertyFilter = mf;

                            if (message is UpdateMessage updmsg)
                            {
                                var msg = new Message(updmsg)
                                {
                                    Priority = priority
                                };
                                q.Send(msg, updmsg.ToString());
                            }
                            else
                            {
                                var msg = new Message(message)
                                {
                                    Priority = priority
                                };
                                q.Send(msg, message.ToString());
                            }
                        }
                    }
                    else
                    {
                        Logger.Error(new Exception("StarChef Message Queue: " + _poisonQueueName + " does not exist. Please check MSMQ Setup"));
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("StarChef: MSMQ Errored while adding a message to the Poison Queue.", ex);
            }
        }
示例#29
0
        /// <summary>
        /// Sets the queue on the transport to the specified MSMQ queue.
        /// </summary>
        /// <param name="q">The MSMQ queue to set.</param>
        protected void SetLocalQueue(MessageQueue q)
        {
            //q.MachineName = Environment.MachineName; // just in case we were given "localhost"
            if (!q.Transactional)
            {
                throw new ArgumentException("Queue must be transactional (" + q.Path + ").");
            }
            else
            {
                LocalQueue = q;
            }

            MessagePropertyFilter mpf = new MessagePropertyFilter();

            mpf.SetAll();

            LocalQueue.MessageReadPropertyFilter = mpf;
        }
示例#30
0
        public void LocalInitialize(bool isTransactional, IMessageSerializer messageSerializer, String channelInfo
                                    , string failoverQueueName, int failoverRetryInterval, int failoverWaitInterval)
        {
            base.IsTransactional   = isTransactional;
            base.MessageSerializer = messageSerializer;
            ChannelInfo            = channelInfo;

            FailoverQueueName     = failoverQueueName;
            FailoverRetryInterval = failoverRetryInterval;
            FailoverWaitInterval  = failoverWaitInterval;

            _failoverQueue = new MessageQueue(FailoverQueueName);

            MessagePropertyFilter messagePropertyFilter = new MessagePropertyFilter();

            messagePropertyFilter.SetAll();

            _failoverQueue.MessageReadPropertyFilter = messagePropertyFilter;
        }