1

私は nServiceBus を扱っていますが、再試行して、失敗したときに別のときにメッセージを送信したいと考えています。Bus.Defer() について聞いたことがありますが、それについての私の理解は限られています。

ストックコードをチェックするシステムがあります。コマンドが呼び出されたときにチェックし、午後 8 時以降に別のチェックを再スケジュールします。

株式コードをチェックする機能を実行する CheckCurrentProductAvailabilityCommand があります。これは CurrentProductAvailabilityRequestHandler によって処理されます。

失敗した場合は、ScheduleCheckStockCodeAvailabilityProcessor によって処理されるストック コードを使用して ScheduleCheckStockAvailabilityCommand を実行します。

次に、関数 _bus.Defer(_checkStockCodeAvailability.TimeOutTime, message.StockCode); を実行します。

私の実際のコード....

if (scheduleRecheck && result.ErrorMessage.Equals("Bad Request"))
            {
                Logger.Error("Stock query for stock code '{0}' returned a 'Product Not Found' status",
                    stockcode);

                _bus.SendLocal<ScheduleCheckStockAvailabilityCommand>(cmd =>
                {
                    cmd.StockCode = stockcode;
                });
            }
        }

上記のコードは正常に動作します。

public class ScheduleCheckStockCodeAvailabilityProcessor : IHandleMessages<ScheduleCheckStockAvailabilityCommand>
{
    readonly ICheckStockCodeAvailability _checkStockCodeAvailability;
    readonly IBus _bus;

    public ScheduleCheckStockCodeAvailabilityProcessor(ICheckStockCodeAvailability checkStockCodeAvailability, IBus bus)
    {
        _checkStockCodeAvailability = checkStockCodeAvailability;
        _bus = bus;
    }

    public void Handle(ScheduleCheckStockAvailabilityCommand message)
    {
        _bus.Defer(_checkStockCodeAvailability.TimeOutTime, message.StockCode);
    }
}

しかし、これがどのように機能するかを論理的に考えることはできません。

何か助けはありますか?

4

1 に答える 1

1

あなたのコードで

if (scheduleRecheck && result.ErrorMessage.Equals("Bad Request"))
            {
                Logger.Error("Stock query for stock code '{0}' returned a 'Product Not Found' status",
                    stockcode);

                _bus.SendLocal<ScheduleCheckStockAvailabilityCommand>(cmd =>
                {
                    cmd.StockCode = stockcode;
                });
            }
        }

メッセージ ScheduleCheckStockAvailabilityCommand を送信しています。今、あなたの他の機能では、このメッセージ、つまり ScheduleCheckStockAvailabilityCommand を延期しています (これは、 CheckCurrentProductAvailabilityCommand でエラーが発生した場合にのみ呼び出されると思います)。したがって、私が収集したものによると、ScheduleCheckStockAvailabilityCommand ではなく CheckCurrentProductAvailabilityCommand を延期したいので、コードは次のようになるはずです。

if (scheduleRecheck && result.ErrorMessage.Equals("Bad Request"))
            {
                Logger.Error("Stock query for stock code '{0}' returned a 'Product Not               Found' status",stockcode);
              _bus.Defer(_checkStockCodeAvailability.TimeOutTime, CheckCurrentProductAvailabilityCommand);

            }
        }
于 2013-11-15T16:38:30.587 に答える