NServiceBus: проблема с тем, чтобы PubSub работал с дистрибьютором - PullRequest
0 голосов
/ 10 июня 2011

Я использую NServiceBus 2.5 и пытаюсь получить упрощенную версию образца NServiceBus PubSub для работы с дистрибьютором.Упрощение:

  • 1 Publisher
  • Распространитель
  • 1 Подписчик Все это на одной машине.

Я бы хотел, чтобы это сработало, прежде чем перейти к более сложным вещам, таким как несколько подписчиков за одним дистрибьютором, несколько машин и т. Д.

Сначала я получил упрощенный паб-сабпример работы без дистрибьютора (т.е. 1 паб и 1 саб - и я понял, что работает нормально).

Насколько я понимаю, он должен работать следующим образом: Дистрибьютор определяет свой собственный контроль и очереди данных.У издателя есть контрольная очередь, но никакая другая конфигурация не ссылается на эту очередь.Издатель ссылается на очередь распространения данных.Подписчик обращается к распределителям данных и контрольным очередям.

Мне не удалось заставить упрощенного распространителя pub-sub работать с этим конфигом.Я выполнил некоторую отладку издателя, и обнаружил, что у издателя Bus.Publish нет подписчиков для публикации.

Есть идеи, что я делаю неправильно и что мне нужно сделать, чтобы это работало?

Вот конфиги для каждого из них:

Publisher :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" />
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" />
  </configSections>

  <MsmqTransportConfig InputQueue="MyPublisherInputQueue" ErrorQueue="error" NumberOfWorkerThreads="1" MaxRetries="5" />

  <UnicastBusConfig>
    <MessageEndpointMappings>
        <add Messages="MyMessages" Endpoint="distributorDataBus" />
    </MessageEndpointMappings>
  </UnicastBusConfig>

</configuration> 

Дистрибьютор

    <add key="DataInputQueue" value="distributorDataBus"/>
    <add key="ControlInputQueue" value="distributorControlBus"/>
    <add key="ErrorQueue" value="error"/>
    <add key="StorageQueue" value="distributorStorage"/>

    <add key="NameSpace" value="http://www.UdiDahan.com"/> 
    <!-- relevant for a Serialization of "interfaces" or "xml" -->

    <add key="Serialization" value="xml"/>
    <!-- can be either "xml", or "binary" -->
  </appSettings>
</configuration>

Подписчик

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" />
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" />
  </configSections>

  <MsmqTransportConfig
    InputQueue="Subscriber1InputQueue_1"
    ErrorQueue="error"
    NumberOfWorkerThreads="1"
    MaxRetries="5"
  />

  <UnicastBusConfig  DistributorControlAddress="distributorControlBus" DistributorDataAddress="distributorDataBus">
    <MessageEndpointMappings />
  </UnicastBusConfig>

</configuration>

1 Ответ

1 голос
/ 10 июня 2011

Хорошо, я наконец-то заработал. Ключ ключ от сюда пришел: http://tech.groups.yahoo.com/group/nservicebus/message/8525

По сути, подписчик должен быть указан издателем, добавив этот раздел:

<UnicastBusConfig  DistributorControlAddress="distributorControlBus" DistributorDataAddress="distributorDataBus">
  <MessageEndpointMappings>
    <add Messages="MyMessages" Endpoint="MyPublisherInputQueue" />
  </MessageEndpointMappings>
</UnicastBusConfig>

Сначала я думал, что это заставляет подписчика регистрироваться непосредственно у издателя, но нет. Я проверил это с двумя разными подписчиками, указавшими на одного и того же дистрибьютора, и отметил, что только один из подписчиков получает какое-либо отдельное событие.

...