2014-11-19 2 views
2

Есть ли причина, по которой Rebus не может использоваться в протоколе pub/sub, подписываясь на несколько конечных точек, публикующих сообщения из общей сборки?Rebus не может подписаться на несколько конечных точек с одинаковым значением «сообщений»

Когда я пытаюсь настроить подписчика Ребус с этим:

<rebus inputQueue="ocs.subscriber.input" errorQueue="ocs.subscriber.error" workers="1" maxRetries="5"> 
    <endpoints> 
    <add messages="D3A.Messages" endpoint="ocs.publisher.input" /> 
    <add messages="D3A.Messages" endpoint="[email protected]" /> 
    </endpoints> 
</rebus> 

Исключение брошено в

.Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig()) 

за исключением выброшен это:

An unhandled exception of type 'Rebus.Configuration.ConfigurationException' occurred in Rebus.dll 

Additional information: 

An error occurred when trying to parse out the configuration of the RebusConfigurationSection: 


System.Configuration.ConfigurationErrorsException: The entry 'D3A.Messages' has already been added. (C:\projects\OCS.Subscriber\bin\Release\OCS.Subscriber.vshost.exe.Config line 22) 

    at System.Configuration.BaseConfigurationRecord.EvaluateOne(String[] keys, SectionInput input, Boolean isTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult) 

    at System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult, Boolean getLkg, Boolean getRuntimeObject, Object& result, Object& resultRuntimeObject) 

    at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject) 

    at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject) 

    at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject) 

    at System.Configuration.BaseConfigurationRecord.GetSection(String configKey) 

    at System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(String sectionName) 

    at System.Configuration.ConfigurationManager.GetSection(String sectionName) 

    at Rebus.Configuration.RebusConfigurationSection.LookItUp() 

    at Rebus.Transports.Msmq.MsmqConfigurationExtension.UseMsmqAndGetInputQueueNameFromAppConfig(RebusTransportConfigurer configurer) 

Это кажется бит странный для меня. Похоже, что вполне допустимый прецедент, чтобы иметь подписчика Rebus для нескольких издателей - некоторые из них используют общую сборку POCO.

Какова причина этого ... и (что более важно), есть ли способ достичь этого в Ребусе?

А также: я ожидал, что Rebus добавит это исключение в журнал (я использую log4net), но кажется, что исключения, которые были выбраны во время конфигурации Rebus, не регистрируются. Это, должно быть, ошибка, не так ли?

ответ

1

Причина, по которой она не работает, заключается в том, что предполагается, что каждый тип сообщения принадлежит («принадлежит») только одной логической услуге.

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

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

PS: Хорошо найти с лесозаготовительной вещью - я создал an issue и это будет исправлено в ближайшее время;)

PPS: Обновление о регистрации вещи - теперь я помню, что Ребус намеренно не регистрирует ошибку во время настройки - рассуждение заключается в том, что ведение журнала выполняется только для исключений, которые не отображаются на вызывающем абоненте, потому что вы сможете поймать другие исключения и делать то, что, по вашему мнению, должно быть сделано с ними.

+0

ОК, я вижу - я просто не понимаю этого предположения. На самом деле у нас есть другая система/издатель, использующая ту же самую сборку (и «устаревший MSMQ, хотя», и абонент не сможет использовать эту публичную услугу с помощью Rebus. Я предполагаю, что абонент использует конфиг, когда bus.Subscribe < >, и он может так же легко проходить через конечную точку conf и отправлять под-сообщение каждому из них. Во время приема абоненту все равно, куда он был отправлен. Сборка D3A.Messages (к сожалению) довольно огромная и используется довольно многими различными системами здесь. –

+0

вы _could_ используете одно и то же центральное хранилище подписки для всех ваших издателей - таким образом, 'bus.Subscribe ()' будет подписываться на 'SomeMessage', независимо от того, кто заканчивает публикацию ... каждый абонент просто должен иметь отображение конечной точки, которое отображает вашу сборку сообщений одному из издателей .... – mookid8000

+0

ой, и теперь я помню, что я сделал [образец, который демонстрирует в значительной степени это сценарий] (HTTP s: //github.com/rebus-org/RebusSamples/tree/master/MessageBus) только там, где каждая конечная точка сопоставила сообщения самому себе (таким образом, позволяя конечной точке использовать свои собственные подписки без привлечения каких-либо издателей) – mookid8000

 Смежные вопросы

  • Нет связанных вопросов^_^