1

私は自分のアプリケーションの 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();サガで実行。

しかし、私が得ている結果はかなりがっかりしています。私が見つけたのは、ハンドラーから複数回返信している場合(サブスクライバーロジックの実行シーケンスのように)、ハンドラーの実行スコープが終了すると、すべてのメッセージがパブリッシャーキューにまとめて送信されることです。

私が間違っている場合は修正し、誰かが持っている場合は解決策を提案してください。スレッドで同じことを達成できました。しかし、私はそれを自分で管理したくないので、コードから返信されたときにメッセージをキューにプッシュする非同期の方法はありますか?

4

1 に答える 1

1

あなたが経験しているのは、すべての発信メッセージも送信されるキュー トランザクションでメッセージが処理されるという事実の結果です。

これは、送信されたすべてのメッセージが、使用しているキュー システムに配信されたとしても、トランザクションがコミットされるまで誰にも配信されないことを意味します。

これはまた、目的を達成するために、サガ アクションを複数の個別のステップに分割する必要があることを意味します。

それは理にかなっていますか?

于 2013-08-02T21:37:06.677 に答える