Есть ли причина, по которой 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, не регистрируются. Это, должно быть, ошибка, не так ли?
ОК, я вижу - я просто не понимаю этого предположения. На самом деле у нас есть другая система/издатель, использующая ту же самую сборку (и «устаревший MSMQ, хотя», и абонент не сможет использовать эту публичную услугу с помощью Rebus. Я предполагаю, что абонент использует конфиг, когда bus.Subscribe < >, и он может так же легко проходить через конечную точку conf и отправлять под-сообщение каждому из них. Во время приема абоненту все равно, куда он был отправлен. Сборка D3A.Messages (к сожалению) довольно огромная и используется довольно многими различными системами здесь. –
вы _could_ используете одно и то же центральное хранилище подписки для всех ваших издателей - таким образом, 'bus.Subscribe()' будет подписываться на 'SomeMessage', независимо от того, кто заканчивает публикацию ... каждый абонент просто должен иметь отображение конечной точки, которое отображает вашу сборку сообщений одному из издателей .... –
mookid8000
ой, и теперь я помню, что я сделал [образец, который демонстрирует в значительной степени это сценарий] (HTTP s: //github.com/rebus-org/RebusSamples/tree/master/MessageBus) только там, где каждая конечная точка сопоставила сообщения самому себе (таким образом, позволяя конечной точке использовать свои собственные подписки без привлечения каких-либо издателей) – mookid8000