我正在处理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);
}
}
但我无法从逻辑上考虑这是如何运作的。
任何帮助?
答案 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);
}
}