我很好奇 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”。