我们使用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();
}发布于 2010-02-22 22:18:34
您应该更新消息并将其重新排队,而不是回滚读取操作。
您应该做的第一件事是为您不想再次处理的消息创建一个失败的验证队列。(保留消息以研究问题非常有用,而队列是一个很自然的位置。)
接下来,如果您只想重试一次,则可以将其写入重试队列并修改验证过程,以便将源自重试队列的失败发送到失败的验证队列。
如果希望能够多次重试验证,则应修改消息格式本身,使其包含重试的次数,并在每次进程将消息重新排队时递增该次数。
一旦消息达到允许的最大尝试次数,您的进程就可以将其发送到失败的验证队列。
使用MSMQ,您不必修改消息格式:您可以使用Message.Extension来存储尝试的次数,尽管它通常不受欢迎-正如它在该属性的文档中所说:“在可能的情况下,应该将消息数据包括在消息的Body属性中,而不是扩展属性中。”
https://stackoverflow.com/questions/2311300
复制相似问题