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