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