Properties 仅当用户执行某些操作时才从队列中删除消息

Properties 仅当用户执行某些操作时才从队列中删除消息,properties,msmq,message,peek,Properties,Msmq,Message,Peek,我们有一个从MSMQ读取数据的MVC应用程序。 我们正试图找到一种方法,从队列中读取消息,并仅当用户对队列执行了成功操作时才将其从队列中删除。 消息应保留在队列中,直到用户完成处理。在处理消息对象的用户完成操作之前,消息不应提供给任何其他人 是否有将消息对象设置为Peek的属性,该属性在将消息放回队列或从队列中删除之前不允许再次读取该消息 我们不确定在这种情况下使用MSMQ是否是一个好主意?队列是正确的主意。你那种“把它留在队列中,锁着,但仍然有点可用”的做法是错误的 您可能需要多个队列 进程A

我们有一个从MSMQ读取数据的MVC应用程序。 我们正试图找到一种方法,从队列中读取消息,并仅当用户对队列执行了成功操作时才将其从队列中删除。 消息应保留在队列中,直到用户完成处理。在处理消息对象的用户完成操作之前,消息不应提供给任何其他人

是否有将消息对象设置为Peek的属性,该属性在将消息放回队列或从队列中删除之前不允许再次读取该消息


我们不确定在这种情况下使用MSMQ是否是一个好主意?

队列是正确的主意。你那种“把它留在队列中,锁着,但仍然有点可用”的做法是错误的

您可能需要多个队列

  • 进程A使队列1中的某些内容排队

  • 进程B从队列1中退出队列并开始工作

    • 如果B成功了,就是这样

    • 否则,它会在其他地方排队(可能是同一个队列,或者可能是队列2)进行后续工作

  • 如果它回到队列1,B最终会再次找到它。若它转到另一个队列,那个么另一个进程将执行清理、日志记录、错误修复等操作,可能会将某些内容放回队列1

    队列不是数据库——没有任何状态(不,“不要看我,我正在处理”)

    队列是临时存储。有人写,有人读,就这样


    如果您想要可靠性,请阅读以下内容:

    这是:

    这是:


    可靠性是队列的一项功能,而不是您的应用程序。您可以执行“可恢复读取”。它是队列API的一部分

    听起来您需要在事务模式下使用队列。然后,您的客户机可以接收消息,对其进行处理,然后提交事务,此时消息将最终退出队列。但是,当事务处于活动状态时,其他客户端将看不到该消息——它将保留,直到事务完成或中止

    这篇MSDN文章对MSMQ的可靠消息传递的使用模式进行了全面的概述:


    这与我之前设置的类似。按照我想象的方式,项目被添加到队列(队列是一个数据库表),然后当进程提取它们时,它们被标记为“进程中”并加上时间戳,并且它们保留在表中。流程完成后,将从表中删除该项。要从任何崩溃或孤立项目中恢复,每分钟都会出现另一个进程,并清除时间戳超过15分钟的任何项目的“进程中”标志—比实际完成所需的时间长得多。这就是你的建议吗?这正是我想要的。此外,如果流程无法成功完成,则应将消息添加回队列,或将消息标记为可在稍后阶段提取。请您建议在这种情况下使用MSMQ是否是一个好的选择。您能告诉我您在设置中使用了什么吗?如果您反对“将它留在队列中,但锁定它”的方法,您如何处理应用程序崩溃或连接丢失,以防处理器停止工作?我担心的是,我从队列中删除以便处理它们的项目在未完成的情况下将永远无法返回到队列中。我可以编写异常代码并处理崩溃,但恐怕我会错过一些边缘案例。这正是我们面临的问题。如何确保从队列中读取消息后消息不会丢失。在这种情况下,我必须将事务对象传递到UI层。这样做是个好主意吗?我们从未使用过MSMQ事务,因此任何输入都会对我们有很大帮助。在不了解您的应用程序的情况下,我无法确定将事务逻辑放入视图层是否是一个好主意,但我通常建议您不要这样做。在我们的应用程序中,我们正在从队列中读取消息。消息对象将向用户显示在视图上。用户可能会更改保存时命中的值。此时,消息被放置在另一个队列中。我们希望确保在从队列读取数据和执行保存操作(由用户触发)的过程中不会丢失消息。您能建议在这种情况下使用事务处理是否合适吗?我认为事务处理应该是完全合适的。如果您的视图当前是直接从队列中提取消息,那么我认为将其扩展到处理事务并没有什么实际危害。然而,在某些情况下,您可能需要研究在视图和后端队列之间放置控制器层,以确保事务正确启动和解决。在每个视图中重新实现相同的消息处理逻辑将不必要地重复代码。