2017-01-06 1 views
-1

私は、サードパーティAPIの定期的なポーリングが必要なアプリケーションで作業しています。このプロジェクトでは、NServiceBusを頻繁に使用していました。私は、私のポーラーの状態を維持するために、佐賀のメリットを利用することに決めました。Bus.Publish(IEvent)の代わりにBus.SendLocal(IMessage)を使ってSagaを起動する

つまり、Sagaは、ポーリングが正しく行われるようにするために必要な情報を維持するために使用されます。また、次回のポーリングが確実に行われるように(各ポーリング後に)タイムアウトを作成することが簡単です何らかの理由でサービスが停止/侵害/ブロックされた場合。

私の最初の問題は、サービスを独自のイベントに登録させることによってSagaを開始し、サービス開始時に(IWantToRunWhenBusStartsAndStopsを使用して)それらのイベントの1つを公開することに決めたときに発生しました。その問題は、サービスが開始され、イベントを公開することですが、サブスクリプションが作成される前に発生します。したがって、サービスは、私がそれを再開しない限り、佐賀全体を蹴飛ばすために意図されたイベントを処理しません。この問題を回避するためにサービスを再起動することは、私が検討したい解決策ではありません。それ以来

、およびいくつかは、遊んで、私は(MyMessageはIMessageがを実装)

Bus.SendLocal(new MyMessage());を使用すると、効果的にサブスクリプションを必要とせずに、佐賀を開始することを発見しました。 Sagaはデータベースに作成されます(永続性のためにNHibernate & MSSQLを使用します)、タイムアウトが正しく作成され、期待どおりに機能します。

このソリューションの私の唯一の問題は、NServiceBusのドキュメントで何も参照できないことを行っていることです。将来のバージョンで消える「機能」を利用している可能性があります。実際には意図しない副作用があるためです。

一言で言えば、SendLocalを使ってIMessageを送信して佐賀を始めています。それは100%動作し、すべての私の問題を修正するが、それは "正しい"ですか?

+0

私はこのアプローチに関して技術的な問題は見つけられませんが、あなたが言及しているのは、決して終わりのない伝説の形です。ポーリングする必要がない方法でドメインをモデル化できるかどうかを確認してください。 –

答えて

2

あなたの解決策は絶対に正しいので、私がそれをしないと考えることができる理由はありません。

+0

ありがとうSean - 答えに感謝します。 IMessageをローカルに送信してイベントを公開するのではなく、サガを開始するのはちょっとした "ボギー"だと感じました。私は主題のあなたの優れた知識に屈するでしょう。ありがとう:) – Archer

関連する問題