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 出现一些错误时才会调用它)。因此,根据我收集到的内容,您想推迟 CheckCurrentProductAvailabilityCommand 而不是 ScheduleCheckStockAvailabilityCommand 所以我认为您的代码应该是:

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 回答