Nservicebus msmq для лазурной очереди с использованием шлюза
Я получаю сообщение об ошибке при использовании Bus.SendToQueues, подробное сообщение об ошибке в конце вопроса.
У меня есть очередь Azure, настроенная с учетной записью и ключом хранилища, и я пытаюсь использовать Bus.SendToSites, чтобы обработчик служебной шины с помощью msmq отправлял сообщение на сайт Azure.
Пытаюсь запустить шлюз, как это описано на сайте: http://support.nservicebus.com/customer/portal/articles/859548-the-gateway-and-multi-site-distribution, и я использую эту конфигурацию:
App.config: (Я правильно настраиваю сайт?)
<section name="GatewayConfig" type="NServiceBus.Config.GatewayConfig, NServiceBus.Core" />
<GatewayConfig>
<Sites>
<Site Key="Azure" Address="http://<!--STORAGE ACCOUNT NAME-->.queue.core.windows.net/<!--STORAGE ACCOUNT KEY-->" ChannelType="Http"/>
</Sites>
</GatewayConfig>
Обработчик:
Bus.SendToSites(new[] { "Azure" }, message);
Во время выполнения я получаю следующее:
ошибка: не удалось отправить сообщение по адресу: адрес данных дистрибьютора, используемый в качестве адреса возврата сообщений, отправленных этой конечной точкой..gateway@HFORTE
Внутреннее исключение: {"Имя формата неверно."}
Stacktrace: в System.Messaging.MessageQueue.MQCacheableInfo.get_WriteHandle() в System.Messaging.MessageQueue.StaleSafeSendMessage(свойства MQPROPS, транзакция ITransaction) в системном объекте.SendInternal(Объект obj, MessageQueueTransaction internalTransaction, MessageQueueTransactionType TransactionsType) в System.Messaging.MessageQueue.Send(Объект obj, MessageQueueTransactionType TransactionsType) в NServiceBus.Transports.Msmq.Messess.Messess.Messess.Messm.Messm.Messm.
Я вижу, что транспорт - это MSMQ. В этом ли проблема, что MSMQ и Azure - это разные транспортные протоколы, и если да, то как это исправить?
2 ответа
Чтобы использовать шлюзы, вы должны иметь NSB, размещенный с обеих сторон - отправитель и получатель. Шлюзы просто открывают службу WCF для конечной точки NSB, чтобы вы могли отправлять сообщения по протоколу HTTP.
Транспорты очереди MSMQ и Azure нельзя объединить в одном решении, поскольку экземпляр IBus является одноэлементным. Нам пришлось разработать собственный сервис "бридж" с использованием RavenDb. Мы выбрали Raven, поскольку он имеет механизм подписки на события, управляемый RX, который также прост в использовании. Мы также можем сохранять сообщения (упакованные в некоторые контейнеры) без особых усилий, поскольку RavenDb - это база данных документов.
Адрес вашего сайта не должен быть адресом вашей очереди Azure. Это должен быть адрес канала принимающего шлюза NServiceBus.
В данном случае это просто совпадение, что и очереди Azure, и шлюз NSB используют HTTP.
Ваш отправитель (размещенный в помещении) будет иметь этот конфиг
<GatewayConfig>
<Sites>
<Site Key="Azure" Address="https://some.address.com" ChannelType="Http"/>
</Sites>
</GatewayConfig>
Конечная точка NSB, размещенная на Azure, будет иметь эту конфигурацию шлюза
<GatewayConfig>
<Channels>
<Channel ChannelType="Http" Address="https://some.address.com" Default="True"/>
</Channels>
</GatewayConfig>