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="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

これがすぐに機能しない理由は、各メッセージ タイプが 1 つの論理サービスのみに属している (「所有されている」) と想定されているためです。

パブリッシャーの名前から、それらは同じであると思います-つまり、同じ論理サービスの2つのインスタンスです。つまり、サブスクリプションストレージを共有できるようにすることで、目的を簡単に達成できます-たとえば、共有 SQL サーバー。

サブスクリプション ストレージを共有する場合、どちらがサブスクリプション要求を受け取るかは問題ではないため、メッセージ アセンブリをいずれかのインスタンスにマップするだけで済みます。

PS: ロギングに関する問題が見つかりました -問題を作成しましたが、すぐに修正される予定です ;)

PPS: ロギングに関する更新 - Rebus は構成中に意図的にエラーをログに記録しないことを今思い出しました - その理由は、呼び出し元に表示されない例外に対してのみロギングが行われるためです。他の例外をキャッチできるからです。例外を処理し、それらに対して行う必要があると思われることを行います。

于 2014-11-19T12:08:24.003 に答える