Exemple #1
0
        /// <summary>
        /// Опубликовать сообщение.
        /// </summary>
        /// <param name="securityToken">Маркер безопасности.</param>
        /// <param name="message">Сообщение.</param>
        public void Publish(string securityToken, IntegrationBusMessage message)
        {
            _securityTokenValidator.Validate(securityToken);

            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            if (string.IsNullOrWhiteSpace(message.ExchangeName))
            {
                throw new ArgumentException(Resources.ExchangeNameCannotBeNullOrWhiteSpace, "message");
            }

            _queuePublisher.Publish(message.ExchangeName, message.RoutingKey, message.Properties, message.Body);
        }
Exemple #2
0
        public void Handle(Message message)
        {
            // В данном месте осуществляется "redirect" из внутренней шины сообщений внешней информационной системе.
            // Предполагается, что внешняя информационная система имеет REST-сервис, способный принимать и обрабатывать
            // сообщения нашей интеграционной шины. Для популярных систем в дальнейшем могут быть разарботаны адаптеры
            // интеграции, которые будут размещаться на стороне внешней информационной системы, и предоставлять нужный
            // REST-сервис.

            var subscriptionAddress = _subscriptionStorage.GetSubscriptionAddress(message.ConsumerId);

            if (string.IsNullOrWhiteSpace(subscriptionAddress) == false)
            {
                var busMessage = new IntegrationBusMessage
                {
                    ConsumerId   = message.ConsumerId,
                    ExchangeName = message.Exchange,
                    RoutingKey   = message.RoutingKey,
                    Properties   = message.Properties,
                    Body         = message.Body
                };

                WebRequestHelper.Post(new Uri(subscriptionAddress), busMessage);
            }
        }
        private static void VerifySubscriptionAddress(string subscriptionAddress)
        {
            var testMessage = new IntegrationBusMessage {
                ConsumerId = "Test", ExchangeName = "Test", RoutingKey = "Test", Body = Encoding.UTF8.GetBytes("Test")
            };

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

                WebRequestHelper.Post(new Uri(subscriptionAddress), testMessage);
            }
            catch (Exception error)
            {
                throw new ArgumentException(string.Format(Resources.SubscriptionServiceIsNotAvailable, subscriptionAddress), "subscriptionAddress", error);
            }
        }