gpt4 book ai didi

c# - MSMQ 接收事务 - 回滚不使消息再次可用

转载 作者:太空狗 更新时间:2023-10-29 17:54:03 28 4
gpt4 key购买 nike

我在名为“MessageQueueReceive”的类中有这个。

public MessageQueueTransaction BlockingReceive(out Message message)
{
MessageQueueTransaction tran = null;
message = null;

tran = new MessageQueueTransaction();

tran.Begin();
try
{
message = Queue.Receive(new TimeSpan(0, 0, 5), tran);
}
catch (MessageQueueException ex)
{
// If the exception was a timeout, then just continue
// otherwise re-raise it.
if (ex.MessageQueueErrorCode != MessageQueueErrorCode.IOTimeout)
throw ex;
}

return tran;

}

然后我的处理循环有这个:-

while (!Abort)
{
try
{
tran = this.Queue.BlockingReceive(out msg);

if (msg != null)
{
// Process message here

if (tran != null)
tran.Commit();
}
}
catch (Exception ex)
{
if (tran != null)
tran.Abort();

}
}

控制面板工具显示我使用的消息队列是事务性的。未启用日志队列。

此代码创建队列:-

private static MessageQueue CreateMessageQueue(string queueName, bool transactional = false)
{
MessageQueue messageQueue = MessageQueue.Create(queueName, transactional);
messageQueue.SetPermissions("Administrators", MessageQueueAccessRights.FullControl,
AccessControlEntryType.Allow);
return messageQueue;
}

调用时事务参数设置为“true”。

我发现,当在消息处理过程中发生异常时,会调用 tran.Abort,但此时我希望消息返回到队列中。然而,这并没有发生,消息丢失了。

我是否遗漏了一些明显的东西?谁能看出我做错了什么?

最佳答案

感谢所有评论。我确实按照 Russell McClure 的建议重新组织了我的代码,我尝试创建简单的测试用例,但无法重现问题。

最后,问题根本不在我正在寻找的地方(这种情况多久发生一次?)。

在我的管道中,我有一个重复消息检查器。我的系统处理的“消息”来自 WAN 上的远程设备,有时线路上的消息是重复的。

当从 MSMQ 中提取一条消息时,它将通过重复检查器传递给数据库编写器。如果数据库编写器失败,则检查的副本不会从其表中删除散列。当进程尝试再次循环时,它会再次从队列中获取相同的消息,因为数据库写入器失败时 MSMQ 事务已回滚。然而,在第二次尝试时,重复检查器会发现它以前看过这条消息,然后默默地吞下它。

解决方法是让重复检查器发现来自链中下一个链接的异常,并回滚它所做的任何事情。

关于c# - MSMQ 接收事务 - 回滚不使消息再次可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8144125/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com