2009-10-23 4 views
1

Можно ли настроить конечную точку для выполнения работником, получающего задания от дистрибьютора И подписываться на какие-то сообщения?Конфигурирование конечной точки для работы как рабочего, так и подписчика

У меня есть следующий сценарий (адаптированный к продаже терминологии)

*) центральный отдел публикует каждый сейчас, а затем список новых цен. Все работники должны быть уведомлены. Это означает, что работник должен подписаться на это событие.

*), когда новый заказ поступает в центр, он отправляет его дистрибьютору, который отправляет его следующему незанятому работнику, который должен быть обработан. Это означает, что работник должен быть настроен на получение сообщений от дистрибьютора. Я использую следующую конфигурацию:

<MsmqTransportConfig 
    InputQueue="worker" 
    ErrorQueue="error" 
    NumberOfWorkerThreads="2" 
    MaxRetries="5" 
    /> 

    <UnicastBusConfig 
    DistributorControlAddress="distributorControlBus" 
    DistributorDataAddress="distributorDataBus" >  
    <MessageEndpointMappings> 
     <add Messages="Events" Endpoint="messagebus" /> 
    </MessageEndpointMappings> 
    </UnicastBusConfig> 

Когда я устанавливаю его только в качестве работника или только как подписчик все работает, как ожидалось, но не тогда, когда я устанавливаю его как оба.

Я обнаружил, что сообщение поступило в очередь ввода центрального адреса с адресом дистрибьютора в качестве адреса возврата вместо адреса рабочего места, и издатель не признает в этом случае абонента. Любые идеи? Заранее спасибо.

ответ

1

Работники не должны использоваться таким образом IFAIK. Я думаю, что способ пойти на то, чтобы ваша центральная подписка на цены и когда «NewOrderMessage» прибывает, обогащает эти данные требуемыми ценами (возможно, только ценами для продуктов в этом конкретном порядке) и отправляет новый ProcessOrderRequest на вход очередь дистрибьютора.

Другой способ заключается в том, чтобы процесс, который отправляет запрос на заказ, включает цены в запрос заказа.

В этом смысл?

/Andreas

+0

Вот как я делаю это прямо сейчас. Прейскурант прилагается к сообщению заказа. Мое намерение состояло в том, чтобы разделить сообщения и запасную полосу пропускания. Если это не сработает, я могу рассмотреть возможность отправки метки времени текущего прейскуранта и позволить работнику запросить его из центра с использованием Bus.Reply(). Но это также означает, что я должен постоянно сохранять сообщения до получения ответа. – Mouk

+0

Любые другие способы? Необходимые нам данные чрезвычайно тяжелые и не могут быть переданы по кабелю. – theGecko

+0

TheGecko, мы рассматриваем объединение в шину данных для передачи большего количества данных. –

1

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

Если у вас есть несколько логических подписчиков, которые вы хотите масштабировать, дайте каждому из них собственный дистрибьютор.

+0

Думаю, теперь я понимаю концепцию рабочих. Когда работник публикует сообщение, все абоненты конечной точки дистрибьютора должны быть уведомлены. Имеет смысл. – Mouk

+0

Несомненно, несколько дистрибьюторов, каждый со своими работниками, все равно разрешат принимать широковещательные сообщения только дистрибьютором, а не рабочими? – theGecko

+1

theGecko, когда работник публикует сообщение, он устанавливает адрес возврата этого сообщения как адрес своего дистрибьютора, так что подписчикам они выступают в качестве дистрибьютора. Надеюсь это ответит на твой вопрос. –