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

是否有一个消息对象的属性被设置为“Peeked”,该属性将不允许再次读取此消息,直到将其放回队列或从队列中删除为止?

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

有帮助吗?

解决方案

这听起来像你需要在交易模式下使用您的队列(一个或多个)。然后,客户端可以接收消息,对它进行处理,并然后提交事务,在该点处消息将被出列最后。而事务是活动的,然而,其它的客户端不会看到消息 - 它会在储备保持到事务完成或中止

此MSDN制品具有使用模式与MSMQ可靠消息传递体面概述:

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

其他提示

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

您可能需要多个队列。

  1. 进程 A 将某些内容放入队列 1 中

  2. 进程 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 一部分的事务。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top