2

是否有任何理由不能在发布/订阅协议中使用 Rebus,订阅从共享程序集中发布消息的多个端点?

当我尝试使用此配置 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 配置期间引发的异常。这一定是个错误,对吧?

4

1 回答 1

1

它不容易工作的原因是假设每种消息类型仅属于(“拥有”)一个逻辑服务。

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

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

PS:日志记录的好发现 - 我已经创建了一个问题,它将很快得到修复;)

PPS:关于日志记录的更新 - 我现在记得 Rebus 在配置期间故意不记录错误 - 原因是日志记录仅针对调用者未显示的异常进行,因为您将能够捕获另一个例外并做你认为应该用它们做的事情。

于 2014-11-19T12:08:24.003 回答