我们正在使用MSMQ和处理消息的集成机制。此机制分析并验证事务上下文下的每条消息,如果验证失败,则会发生回滚,并将消息传递回队列。此外,集成机制等待20秒再次处理错误消息。
问题是这种方法导致错误消息被反复处理,即使我们清理队列也是如此。我们还尝试清理缓存,但是也没有显示结果。
有没有人有线索?
更新了调用代码
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
//message validation function
servicoIntegracao.Validar(identificadorMensagem, mensagem.Substring(_tamanhoCampoTipoEvento));
servicoIntegracao.ExecutarServico();
AtualizarStatusEventoNegocio(identificadorMensagem, Status.Finalizado);
retorno = 0;
ts.Complete();
}
答案 0 :(得分:3)
您应该更新消息并重新排队,而不是回滚读取操作。
您应该做的第一件事是为您不想再次处理的邮件创建失败的验证队列。 (保持信息来研究问题很有用,队列是一个自然的地方。)
接下来,如果您只想重试一次,可以将其写入重试队列并修改验证过程,以便它发送来自重试队列的失败到失败的验证队列。
如果您希望能够多次重试验证,则应修改邮件格式本身以包含尝试次数,并在每次进程重新排队邮件时增加该次数。
一旦邮件达到允许的最大尝试次数,您的流程就会将其发送到失败的验证队列。
使用MSMQ,您不一定要修改消息格式:您可以使用Message.Extension
来存储尝试次数,尽管通常不赞成 - 正如在该属性的文档中所述:“如果可能,您应该在消息的Body属性中包含消息数据,而不是Extension属性。“