Saga取消/暂停与NServiceBus

时间:2012-05-02 20:13:57

标签: nservicebus saga

我有一个消息处理程序和一个相应的队列,用于" UpdatePricingStrategyCommand"这是要求更新单个产品的定价策略:

public class UpdatePricingStrategyCommand : IMessage
{
  public string ProductId { get; set; }
  public PricingStrategyUpdate Update { get; set; }
  public string TaskId { get; set; }
}

更新定价策略后,处理程序会发布一个事件:

public class PricingStrategyUpdatedEvent : IMessage
{
  public string ProductId { get; set; }
  public string TaskId { get; set; }
}

需要能够更新产品组的定价策略,例如在给定类别的产品上。这些集合中可能包含数百万个产品,整个更新任务可能需要几个小时。这些基于集合的更新由以下内容触发:

public class UpdatePricingStrategyByCriteriaCommand : IMessage
{      
  public ProductCriteria Criteria { get; set; }
  public PricingStrategyUpdate Update { get; set; }
}

此消息由在不同进程中运行不同队列的saga处理。该消息由此消息启动,在saga数据实体中设置唯一的任务ID,调用存储库以获取符合条件的产品集,然后将单独的UpdatePricingStrategyCommand消息发送到上面指定的处理程序。该传奇订阅PricingStrategyUpdatedEvent消息,允许它关联整个任务,存储任务的状态以进行报告和GUI目的。

如何支持取消以及暂停/恢复这些任务?

UpdatePricingStrategyCommand的处理程序需要收到取消请求的通知,但是它的队列可能会被一堆消息备份,因此在完成需要的任务之前它无法访问它被取消。一个解决方案是让传奇处理一个“取消任务命令”'消息,将任务的状态设置为已取消(通过任务存储库),处理程序将在处理消息之前检查任务的状态,如果任务被取消,它将立即返回。对于暂停,一个解决方案是让处理程序检查任务状态并通过调用HandleCurrentMessageLater进入循环,直到收到任务继续命令。

0 个答案:

没有答案