1

この NServiceBus プロジェクトをしばらくやっていて、PubSub で動作するようになったら、残りの時間を実際のワークフロー ロジックに費やしました。ただし、回避したい(または、正しく処理する方法を学びたい)深刻な問題が見られます。

パブリッシャーは、私が理解している限り、すべてのサブスクライバーのストレージ キューにメッセージをパブリッシュします。偉大な。しかし、サブスクライバーが実行されていない場合はどうなりますか (これに関する他の投稿を読みましたが、同じ質問をしていないようです)。

シナリオ - サブスクライバーが実行されていないときにパブリッシャーにメッセージをパブリッシュしてもらいます (サブスクライバーに中継されるように添付/要求されたメッセージ)。どこに行ったの?パブリッシャーは「ねえ、誰もこれをサブスクライブしていないので、わざわざ公開しませんか?」と言いましたか?それはそうすべきではなく、少なくとも1人のサブスクライバーが必要ですか?

誰でもこれに光を当てることができますか?(サービス初心者)

4

2 に答える 2

4

発生したイベントを公開する必要があります。これは、他のハンドラーが関心を持っているかどうかに関係なく、事実のステートメントです。サブスクライバーがゼロであることは完全に有効です。そうでない場合は、イベントを Publish() する代わりに、コマンドを Send() する必要があります。

永続的なサブスクリプション ストレージを使用している場合は、サブスクライバーを一度起動すると、常にサブスクライブされます。サブスクライバーがオフラインの場合、サブスクライバーがオンラインに戻ったときに処理できるように、メッセージが入力キューに積み上げられます。

NServiceBus でテストしているだけの場合、NServiceBus.Host.exe は Lite プロファイルで実行されており、メモリ内 (非永続的) サブスクリプション ストレージを使用しているため、表示されている結果が得られます。

于 2010-12-16T16:37:13.517 に答える
3

あはは!メッセージ タイプのサブスクライバーがないことが常にエラーであるとは限りませんが、それを処理する方法があります。

パブリッシャーで以下を変更するだけです:

IBus Bus

使用するには (NServiceBus.Core.dll と NS NServiceBus.Unicast が必要です):

IUnicastBus Bus

次に、ハンドラーを次のものにアタッチできます。

Bus.NoSubscribersForMessage += .......

これにより、メッセージをエラーキューに入れることができます..または、おそらく永久に再試行する..または何か他のものを公開する..など..何でもしたい.. したがって、特定のシステムが (ビジネスの観点から) 結果を必要とする場合に、何も失われないようにします。

于 2010-12-16T15:48:16.550 に答える