Rebus无法订阅具有相同“消息”值的多个端点

时间:2014-11-19 09:38:23

标签: publish-subscribe rebus

有没有理由说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="ocs.publisher.input@osi2552" />
  </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中实现这个目标?

而且:我期待Rebus将此异常添加到日志中(我使用log4net)但似乎没有记录在Rebus的配置时间内抛出的异常。这一定是个错误,对吧?

1 个答案:

答案 0 :(得分:1)

它之所以不能正常工作的原因是,假设每种消息类型仅属于(“归所有”)一个逻辑服务。

从您的发布者名称我认为它们是相同的 - 即它们是同一逻辑服务的两个实例,这意味着您可以通过让他们共享其订阅存储来轻松实现您所追求的目标 - 例如在共享的SQL Server中。

当他们共享订阅存储时,哪个收到订阅请求并不重要,因此,您只需要将消息程序集映射到其中一个实例。

PS:找到日志记录的好东西 - 我创建了an issue并且很快就会修复它;)

PPS:关于日志记录事项的更新 - 我现在记得Rebus在配置过程中故意不记录错误 - 原因是日志记录仅针对调用者没有出现的异常进行,因为您将能够抓住其他例外,做你认为应该用它们做的事情。