使用nservicebus延迟消息

时间:2013-11-13 16:27:42

标签: nservicebus

我正在处理nServiceBus,我想在其中一个失败的时候重试并发送消息。我听说过Bus.Defer(),但我对它的理解是有限的。

我有一个检查股票代码的系统。它会检查命令何时被调用,并在晚上8点之后重新安排另一个检查。

我有CheckCurrentProductAvailabilityCommand,它运行一个检查股票代码的函数。 这由CurrentProductAvailabilityRequestHandler处理。

如果失败,我会运行ScheduleCheckStockAvailabilityCommand,其股票代码由ScheduleCheckStockCodeAvailabilityProcessor处理。

然后我运行一个函数_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);
    }
}

但我无法从逻辑上考虑这是如何运作的。

任何帮助?

1 个答案:

答案 0 :(得分: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。现在在你的其他函数中,yoe推迟了这条消息,即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);

            }
        }