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

时间:2009-09-02 21:02:39

标签: properties msmq message peek

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

是否有一个Message对象的属性被设置为Peeked,它不允许再次读取此消息,直到它被重新放入队列或从队列中删除?

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

2 个答案:

答案 0 :(得分:1)

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

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

http://msdn.microsoft.com/en-us/library/ms978430.aspx

答案 1 :(得分:0)

队列是正确的想法。你的“将它留在队列中,锁定但仍然可用”的方法是错误的。

您可能需要多个队列。

  1. 进程A在队列1

  2. 中排队
  3. 进程B从队列1中出列并开始工作。

    • 如果B成功,那就是它。

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

  4. 如果它回到队列1,B最终会再次找到它。如果它转到另一个Queue,那么另一个进程会进行清理,记录,错误修复等等,可能会在Queue 1中放回一些东西。

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

    队列是暂时存储。有人写道,别人读,就是这样。


    如果您需要可靠性,请阅读:http://msdn.microsoft.com/en-us/library/ms978430.aspx

    而且:http://blogs.msdn.com/shycohen/archive/2006/02/20/535717.aspx

    而且:http://www.request-response.com/blog/PermaLink,guid,03fb0e40-b446-42b5-ad90-3be9b0260cb5.aspx

    可靠性是队列的一个特征,而不是您的应用程序。你可以做一个“可恢复的阅读”。这是一个事务,它是队列API的一部分。