【问题标题】:MessageQueueTransaction timeout消息队列事务超时
【发布时间】:2011-08-19 16:47:32
【问题描述】:

我在 MSDN 中阅读了有关 MessageQueueTransaction 的信息,但我找不到有关超时的任何信息。如果 Commit 或 Abort 从未被调用会发生什么?事务在打开和释放之间是否存在某种超时?

【问题讨论】:

    标签: .net transactions timeout msmq


    【解决方案1】:

    这是一个内部事务,因此不涉及 MSDTC(确实有超时)。 我相信事务将一直存在,直到您的应用程序调用提交或中止。 如果应用程序失败或没有调用就退出,那么我希望 MSMQ 会为您中止事务。

    您有具体问题还是只是好奇?

    干杯

    约翰·布雷克韦尔

    【讨论】:

    • 想一想,这是有道理的:DTC 事务旨在用于在多个资源管理器之间进行协调。超时是为了防止其中一个离线,从不响应,从而锁定其他所有人。对于内部 MSMQ 事务,没有其他资源管理器,因此不需要这种“保险”。
    【解决方案2】:

    谢谢约翰!我刚刚创建了一个 WCF 服务,它从 MSMQ 接收消息并将它们传输回远程客户端。客户端可以请求 x 条消息。

    客户端首先调用服务启动事务。 该服务将其堆叠在一个带有 GUID 的集合中。该 guid 被发送回客户端,客户端将使用它来调用服务。因此,服务可以找到相应的事务并将其与 Receive() 一起使用。

    客户端完成所有工作后,它调用 Terminate(bool commit) 方法,其 GUID 调用事务上的 Commit 或 Abort。但是,如果由于客户端崩溃或网络中断而从未调用 Commit 或 Abort 怎么办?这是我的担心...

    我这样做基本上是因为 MSMQ 3 不支持远程事务(仅 MSMQ 4)。

    【讨论】:

      【解决方案3】:

      答案在于 MSMQ 本身的内部 ACK 消息传递。因此,要回答您的问题,毫无疑问,如果您在检索后不提交或中止使用事务的消息,它实际上会回滚。这就是处理断电事件等的方式。

      在事务中发送消息时也是如此,除了取决于超时参数外,收件人未能确认收到消息可能最终导致信件进入死信队列。您可以随时重新处理这些 - 但您是否愿意取决于您正在构建的系统类型。

      ---- 根据 MSDN https://msdn.microsoft.com/en-us/library/ms699870(v=vs.85).aspx

      当应用程序请求肯定和否定确认消息时,可以使用有关消息发送操作最终结果的附加信息。有关请求确认消息的更多信息,请参阅确认消息。

      https://msdn.microsoft.com/en-us/library/ms707129(v=vs.85).aspx

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-31
        • 1970-01-01
        • 2015-12-08
        • 1970-01-01
        • 1970-01-01
        • 2018-09-18
        • 2011-05-14
        • 2014-05-07
        相关资源
        最近更新 更多