/// <summary> /// Подписаться на очередь сообщений. /// </summary> /// <param name="securityToken">Маркер безопасности.</param> /// <param name="subscription">Информация о подписке.</param> public void Subscribe(string securityToken, IntegrationBusSubscription subscription) { // Проверка информации о подписке _securityTokenValidator.Validate(securityToken); _subscriptionValidator.ValidateWithAddress(subscription); // Получение метода подписки на очередь сообщений Action <IntegrationBusSubscription> subscriber; var exchangeType = subscription.ExchangeType.Trim().ToLower(); if (_subscribers.TryGetValue(exchangeType, out subscriber) == false) { throw new NotSupportedException(string.Format(Resources.SpecifiedExchangeTypeIsNotSupported, subscription.ExchangeType)); } // Осуществление подписки на очередь сообщений subscriber(subscription); // Сохранение информации о подписке в хранилище _subscriptionStorage.AddSubscription(subscription); // Запуск прослушивания очереди сообщений _queueListener.StartListen(subscription.QueueName); }
/// <summary> /// Удалить подписку на очередь сообщений. /// </summary> /// <param name="securityToken">Маркер безопасности.</param> /// <param name="subscription">Информация о подписке.</param> public void Unsubscribe(string securityToken, IntegrationBusSubscription subscription) { // Проверка информации о подписке _securityTokenValidator.Validate(securityToken); _subscriptionValidator.Validate(subscription); // Получение метода удаления подписки на очередь сообщений Action <IntegrationBusSubscription> unsubscriber; var exchangeType = subscription.ExchangeType.Trim().ToLower(); if (_unsubscribers.TryGetValue(exchangeType, out unsubscriber) == false) { throw new NotSupportedException(string.Format(Resources.SpecifiedExchangeTypeIsNotSupported, subscription.ExchangeType)); } // Остановка прослушивания очереди сообщений _queueListener.StopListen(subscription.QueueName); // Удаление информации о подписке в хранилище _subscriptionStorage.RemoveSubscription(subscription.ConsumerId); // Удаление подписки на очередь сообщений unsubscriber(subscription); }
private static Action <IQueueConfig> QueueConfig(IntegrationBusSubscription subscription) { return(config => config.ConsumerId(subscription.ConsumerId) .AcknowledgePolicy(new OnlyOnSuccessHandlingAcknowledgePolicy()) .WorkerThreadCount(1) .Durable()); }
private static void VerifySubscription(IntegrationBusSubscription subscription) { if (subscription == null) { throw new ArgumentNullException("subscription"); } if (string.IsNullOrWhiteSpace(subscription.ConsumerId)) { throw new ArgumentException(Resources.ConsumerIdCannotBeNullOrWhiteSpace, "subscription"); } if (string.IsNullOrWhiteSpace(subscription.ExchangeType)) { throw new ArgumentException(Resources.ExchangeTypeCannotBeNullOrWhiteSpace, "subscription"); } if (string.IsNullOrWhiteSpace(subscription.ExchangeName)) { throw new ArgumentException(Resources.ExchangeNameCannotBeNullOrWhiteSpace, "subscription"); } if (string.IsNullOrWhiteSpace(subscription.QueueName)) { throw new ArgumentException(Resources.QueueNameCannotBeNullOrWhiteSpace, "subscription"); } if (string.IsNullOrWhiteSpace(subscription.Address)) { throw new ArgumentException(Resources.AddressCannotBeNullOrWhiteSpace, "subscription"); } Uri address; if (Uri.TryCreate(subscription.Address, UriKind.Absolute, out address) && (address.Scheme == Uri.UriSchemeHttp || address.Scheme == Uri.UriSchemeHttps)) { throw new ArgumentException(Resources.AddressShouldBeAbsoluteUriToHttpOrHttpsService, "subscription"); } }
private void UnsubscribeHeaders(IntegrationBusSubscription subscription) { _queueManager .GetExchangeHeaders(subscription.ExchangeName) .Unsubscribe(subscription.QueueName); }
private void SubscribeHeaders(IntegrationBusSubscription subscription) { _queueManager .GetExchangeHeaders(subscription.ExchangeName) .Subscribe(subscription.QueueName, () => _queueConsumer, subscription.RoutingHeaders, QueueConfig(subscription)); }
private void SubscribeDirect(IntegrationBusSubscription subscription) { _queueManager .GetExchangeDirect(subscription.ExchangeName) .Subscribe(subscription.QueueName, () => _queueConsumer, subscription.RoutingKey, QueueConfig(subscription)); }
private void SubscribeFanout(IntegrationBusSubscription subscription) { _queueManager .GetExchangeFanout(subscription.ExchangeName) .Subscribe(subscription.QueueName, () => _queueConsumer, QueueConfig(subscription)); }
/// <summary> /// Осуществить проверку информации о подписке, включая проверку доступности сервиса подписчика для отправки сообщений, и бросить исключение, если информация некорректна. /// </summary> /// <param name="subscription">Информация о подписке.</param> public void ValidateWithAddress(IntegrationBusSubscription subscription) { VerifySubscription(subscription); VerifySubscriptionAddress(subscription.Address); }
/// <summary> /// Осуществить проверку информации о подписке и бросить исключение, если информация некорректна. /// </summary> /// <param name="subscription">Информация о подписке.</param> public void Validate(IntegrationBusSubscription subscription) { VerifySubscription(subscription); }