我们有从 MSMQ 读取数据的 MVC 应用程序。我们正在尝试找到一种方法来从队列中读取消息并将其从队列中删除,前提是用户已经对队列进行了成功的操作。消息应该保留在队列中,直到用户完成处理,在处理消息对象的用户完成操作之前,其他任何人都不能使用该消息。
是否有一个 Message 对象的属性被设置为 Peeked ,它不允许再次读取此消息,直到它被放回队列或从队列中删除?
我们不确定在这种情况下使用 MSMQ 是否是个好主意?
我们有从 MSMQ 读取数据的 MVC 应用程序。我们正在尝试找到一种方法来从队列中读取消息并将其从队列中删除,前提是用户已经对队列进行了成功的操作。消息应该保留在队列中,直到用户完成处理,在处理消息对象的用户完成操作之前,其他任何人都不能使用该消息。
是否有一个 Message 对象的属性被设置为 Peeked ,它不允许再次读取此消息,直到它被放回队列或从队列中删除?
我们不确定在这种情况下使用 MSMQ 是否是个好主意?
听起来您需要在事务模式下使用队列。然后,您的客户端可以接收消息,对其进行处理,然后提交事务,此时消息将最终出列。然而,当事务处于活动状态时,其他客户端不会看到该消息——它将被保留,直到事务完成或中止。
This MSDN article has a decent overview of usage patterns for reliable messaging with MSMQ:
队列是正确的想法。您“将其留在队列中,锁定,但仍然可用”的方法是错误的。
您可能需要多个队列。
进程 A 将队列 1 中的某些内容排入队列
进程 B 从队列 1 中出列并开始工作。
如果B成功,就是这样。
否则,它会在其他地方排队(可能是同一个队列,或者可能是队列 2)以进行后续工作。
如果它回到队列 1,B 最终会再次找到它。如果它进入另一个队列,那么另一个进程会进行清理、日志记录、错误修复或其他任何操作,可能会将某些内容放回队列 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 的一部分的事务。