我们正在使用从MSMQ读取数据的MVC应用程序。 我们试图找到一种从队列中读取消息的方法,并且只有在用户对队列进行了成功操作时才将其从队列中删除。 消息应保留在队列中,直到用户完成处理,在处理消息对象的用户完成操作之前,该消息不应对其他任何人可用。
是否有一个Message对象的属性被设置为Peeked,它不允许再次读取此消息,直到它被重新放入队列或从队列中删除?
我们不确定在这种情况下使用MSMQ是否是一个好主意?
答案 0 :(得分:1)
听起来你需要在事务模式下使用你的队列。然后,您的客户端可以接收消息,处理它,然后然后提交事务,此时消息将最终出列。但是,当事务处于活动状态时,其他客户端将看不到该消息 - 它将保留在事务完成或中止之前保留。
这篇MSDN文章对使用MSMQ进行可靠消息传递的使用模式有了不错的概述:
答案 1 :(得分:0)
队列是正确的想法。你的“将它留在队列中,锁定但仍然可用”的方法是错误的。
您可能需要多个队列。
进程A在队列1
进程B从队列1中出列并开始工作。
如果B成功,那就是它。
否则,它会在其他地方排队(可能是同一个队列,或者可能是队列2),以便进行后续工作。
如果它回到队列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的一部分。