私は自分のアプリケーションの 1 つに Rebus を適応させようとしています。設定が簡単で、すべてうまく機能します。複数のソースからの応答を得るには、PUB/SUB 通信を実装する必要があります。だから私が作ったのは、
Saga(Publisher)
SearchProductSaga : Saga<ProductSagaData>, IAmInitiatedBy<SearchProduct>, IHandleMessages<SearchStarted>, IHandleMessages<SearchProductResponse>, IHandleMessages<SearchCompleted>
Saga の入力キューは -ProductSaga.Queue
Subscriber 1
次の実行シーケンスが含まれます。public class ProductHanderl_1 : IHandleMessage<SearchProduct> { public void Handle(FullTextSearchProductRequest message) { Bus.Reply(SearchStarted); //Some business logic to find products Bus.Reply(AcutalProductResponse); Bus.Reply(SearchCompleted); } }
Subscriber 2
同じ実行シーケンスが含まれていますが、異なるビジネス ロジックが含まれています。
public class ProductHanderl_2 : IHandleMessage<SearchProduct>
{
public void Handle(FullTextSearchProductRequest message)
{
Bus.Reply(SearchStarted);
//Some business logic to find products
Bus.Reply(AcutalProductResponse);
Bus.Reply(SearchCompleted);
}
}
SearchStarted
さて、この実装の後、私が期待していたのは、 へのメッセージを受信することで、現在実行中のサブスクライバーの数を計算できるはずSearchProductSaga
です。サブスクライバがビジネス ロジックを完了すると、SearchCompleted
サガを示すメッセージを送信します。これで完了です。そしてMarkAsComplete();
サガで実行。
しかし、私が得ている結果はかなりがっかりしています。私が見つけたのは、ハンドラーから複数回返信している場合(サブスクライバーロジックの実行シーケンスのように)、ハンドラーの実行スコープが終了すると、すべてのメッセージがパブリッシャーキューにまとめて送信されることです。
私が間違っている場合は修正し、誰かが持っている場合は解決策を提案してください。スレッドで同じことを達成できました。しかし、私はそれを自分で管理したくないので、コードから返信されたときにメッセージをキューにプッシュする非同期の方法はありますか?