【发布时间】:2012-12-08 16:10:22
【问题描述】:
我很好奇 MassTransit 消费者是否可以在实际检索 msg 之前 Peek() MSMQ 队列。
步骤/过程是什么:
1) 消息发送到队列
2) 消费者得到它并且必须进行数据库更新——大约需要 5 秒
3) 如果第一轮成功,消费者必须进行第二轮更新。
我的问题是,如果第一次数据库更新失败,消息留在队列中(即网络问题,无法到达数据库),我该如何处理。
目前,一旦它从队列中读取消息,它就会将其删除,然后如果数据库更新失败,它就会消失..
此外,我该如何处理电源故障 - 我的意思是,如果消费者的“工作”进行到一半,无论是什么(数据库更新或其他)并且电源消失等,我该如何重新运行队列中味精上的进程?可以说这项工作(无论如何在我目前的情况下)正在将新行推送到表中。我的意思是我可以编写代码首先检查该行是否存在,如果存在则删除消息,如果没有则运行任务,但我怎样才能让它首先重新运行整个过程?
我已经读到我可以Peek() 队列然后运行任务,然后真正读取队列消息并将其删除,但我终生无法弄清楚这是否适用于公共交通.. . 有点失落...
此外,我知道 Masstransit 有 .RetryLater,但我是否在此过程中使用它?是Initially --> When --> Then --> .RetryLater 吗??
任何指针都会被应用
最诚挚的问候 罗宾
编辑
PS:我用的是saga....
Define(() =>
{
RemoveWhen(saga => saga.CurrentState == Completed);
Initially(
When(NewAC)
.Then((saga, message) => saga.ProcessPSM(message),
InCaseOf<Exception>()
.TransitionTo(Problem)
)
.Then((saga, message) => saga.PostProcessPSM())
.Complete()
);
During(Problem,
When(Waiting)
// NOTE: THIS DOES NOT WORK!!!!
.RetryLater()
);
});
RetryLater 会抛出以下错误: "现有的 saga 无法接受该消息"
我不确定我还能如何访问“RetryLater”。
【问题讨论】:
标签: masstransit