コード例 #1
0
        private void CreateQueue(QueueConfig queueConfig, Func <IQueueConsumer> consumer, Func <IMessageQueueSession, IMessageQueue> queueFactory)
        {
            if (consumer == null)
            {
                throw new ArgumentNullException("consumer");
            }

            // Очередь должна быть создана вне зависимости от того, когда начнется ее прослушивание
            _queueCommandExecutor.Execute(session => queueFactory(session));


            // Создание менеджера для управления рабочим потоком очереди сообщений

            var queueWorker = new MessageQueueWorker(queueConfig, consumer, _queueCommandExecutor, queueFactory);

            _queueWorkerContainer.RegisterWorker(queueConfig.QueueName, queueWorker);
        }
コード例 #2
0
        private void WorkerThread(object state)
        {
            _startedEvent.Signal();

            try
            {
                // Рабочий поток пытается выполнить прослушивание до тех пор, пока не будет вызван метод остановки рабочего потока.
                // Если функция прослушивания прерывается по какой-либо причине, например, в случае длительного или частого обрыва
                // соединения с сервером очереди сообщений, производится проверка того, что рабочий поток отработал достаточно долго.
                // Если так, то это считается временным сбоем, следовательно, можно предпринять еще одну попытку выполнить прослушивание.

                while (_canListen)
                {
                    var listenStartTime = DateTimeOffset.UtcNow;

                    try
                    {
                        // Прослушивание выполняется под управлением исполнителя команд, который обеспечивает стратегию повторного
                        // выполнения команды (прослушивателя) в случае неудачи, например, в случае обрыва соединения с сервером
                        // очереди сообщений.

                        _commandExecutor.Execute(session =>
                        {
                            using (var queue = _messageQueueFactory(session))
                            {
                                _queues.RegisterObject(queue);

                                ListenQueue(queue);
                            }
                        });
                    }
                    catch (Exception exception)
                    {
                        OnWorkerThreadError(exception);
                    }

                    var listenStopTime = DateTimeOffset.UtcNow;

                    var listeningTime = (listenStopTime - listenStartTime);

                    // Если прослушивание выполнялось не долго, значит, установить соединение с сервером
                    // очереди сообщений так и не удалось. Следовательно, рабочий поток следует прервать.

                    if (listeningTime.Milliseconds < _queueConfig.QueueMinListenTime)
                    {
                        break;
                    }
                }
            }
            catch
            {
            }
            finally
            {
                _stoppedEvent.Signal();
            }
        }
コード例 #3
0
        public void Publish(string exchange, string routingKey, MessageProperties properties, byte[] body)
        {
            if (string.IsNullOrWhiteSpace(exchange))
            {
                throw new ArgumentNullException("exchange");
            }

            _queueCommandExecutor.Execute(session => session.Publish(exchange, routingKey, properties, body));
        }
コード例 #4
0
        private ExchangeBinding GetExchange(string name)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentNullException("name");
            }

            var isExists = false;

            _queueCommandExecutor.Execute(session => isExists = session.ExchangeExists(name));

            if (isExists == false)
            {
                throw new InvalidOperationException(string.Format(Resources.MessageQueueExchangeIsNotExists, name));
            }

            return(new ExchangeBinding(name, _queueCommandExecutor, _queueWorkerContainer, _defaultQueueConfig));
        }