2010-12-16 7 views
1

私はこのNServiceBusプロジェクトをしばらくやっていました。PubSubで作業したら、残りの時間を実際のワークフローロジックに費やしました。しかし、私は周りに行きたい(または正しく扱う方法を学ぶ)深刻な問題を見ることができます。NServiceBus pub/sub - どこにメッセージが残っていますか?

パブリッシャーは、私が理解している限り、どのサブスクライバーのストレージキューにもメッセージをパブリッシュします。すばらしいです。しかし、サブスクライバが実行されていないときはどうなりますか(私はこれについて他の投稿を読んだことがあり、同じ質問をしているようには見えません)。

シナリオ - サブスクライバが実行されていないときにメッセージをパブリッシュするようにしました(添付された/要求されたメッセージが中継される)..メッセージが消えてしまった!それはどこに行きましたか?出版社は「だれもこれを購読していないので、公開するのをやめてもらえませんか?」と言っていましたか?そうではなく少なくとも1人の加入者が必要ですか?

誰もがこれにどのような光を当てることができますか? (nservicenewbie)

+0

これまでの説明から、加入者が「接続」されていないということは必ずしも間違いではありません。私の実際の生活のシナリオでは、あなたはパブリッシャー(パブリッシュするメッセージを読む)と加入者を開始する必要があります。購読者が始まる前に、出版社はたくさんのメッセージを公開していた可能性があります。これらは基本的に失われており、ワークフローアクションは「処理中」の状態で「トラップ」されています。私はnServiceBusのPublishメソッドを変更することができます..しかし、私は本当にしたくありません.. – MRAH

答えて

4

実際に起こった事実、他のハンドラが興味を持っているかもしれない、加入者がゼロになっても有効です!これが当てはまらない場合は、イベントをPublish()する代わりにSend()コマンドを実行する必要があります。

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

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

+0

デビッドをありがとう - ホストexeがLiteプロファイルで実行されているかどうかをどのように伝えることができますか? – MRAH

+0

Sendメソッドに関するあなたの意見に - はい私はSendを使用しているように思えます。しかし、非ライトモードでは、サブスクライバ(ローカル)がオフラインの場合、公開されたこれらのメッセージは単にキューに蓄積されますが、この方法は問題ありません。 – MRAH

+0

プロファイルはコマンドライン引数で選択されます。noneを指定すると、Liteがデフォルトになります。 http://www.nservicebus.com/Profiles.aspxを参照してください。 –

3

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

IBus Bus 

使用するには(あなたがNServiceBus.Core.dllとNS NServiceBus.Unicastが必要になります):

IUnicastBus Bus 

その後、あなたはハンドラをアタッチすることができます単に変更あなたの出版社で

to:

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

これでメッセージをエラーキューに入れることができます。または、おそらく永遠に再試行します。何か他のものなど..あなたが今までに望むもの。したがって、あなたの特定のシステム(ビジネスの観点から)が結果を必要とするところでは何も失われないことを確実にしてください。

関連する問題