2009-09-02 52 views
2

我们正在从MSMQ读取数据的MVC应用程序。 我们试图找出一种方法来从队列中读取消息,并且只有当用户在队列上成功完成操作时才从队列中删除消息。 消息应保留在队列中,直到用户完成处理为止,只有处理消息对象的用户完成了操作之后,该消息才会对其他人可用。仅当用户进行某些操作时才从队列中删除消息

是否有Message对象的属性设置为Peeked,它将不允许再次读取此消息,直到ether被放回队列或从队列中移除为止?

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

+0

这是类似的东西,我设置。我描绘它的方式是将项目添加到队列中(队列是数据库表),然后当它们被进程拾取时,它们被标记为“正在处理”并且已加时间戳,并且它们保留在表。一旦该过程完成,它将从该表中移除该项目。要从任何崩溃或孤立项目中恢复,另一个进程每分钟都会出现,并清除任何时间戳超过15分钟的“正在处理”标志 - 比完成实际需要的时间更长。这就像你的建议? – SqlRyan 2009-09-02 21:14:08

+0

这就是我正在寻找的。另外如果进程不能够成功完成,则应该将消息添加回队列或者消息应该标记为可在稍后阶段被拾取。你能否建议如果在这种情况下使用MSMQ是一个不错的选择。您能否让我知道您在设置中使用了什么? – Balaji 2009-09-02 21:31:39

回答

1

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

这MSDN文章有使用模式的可靠消息传递一个体面的概述与MSMQ:

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

+0

在这种情况下,我将不得不将事务对象传递给UI层。这样做是个好主意吗?我们从未使用过MSMQ交易,因此任何投入都对我们有很大的帮助。 – Balaji 2009-09-03 08:42:39

+0

不知道更多关于您的应用程序的信息,我无法确定是否将事务逻辑放入您的视图层是一个好主意,但我通常会建议您不要这样做。 – rcoder 2009-09-03 16:59:37

+0

在我们的应用程序中,我们正在阅读队列中的消息。 消息对象显示在用户的视图上。 用户可能会更改保存时的值。 此时该消息被放置在另一个队列中。 我们希望确保消息在从队列中读取数据并执行保存操作(由用户触发)的过程中不会丢失。 如果在这种情况下使用交易适合您,您能否建议? – Balaji 2009-09-03 22:54:28

0

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

您可能需要多个队列。

  1. 过程A排入东西在队列从队列1 1

  2. 方法B出列并开始工作。

    • 如果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的一部分。

+0

如果您反对“将其留在队列中,但将其锁定”方法,那么在处理器停止工作的情况下,如何处理应用程序崩溃或连接丢失?我担心我已经从队列中删除的项目,以便我可以处理这些项目,如果它没有完成,它们将永远不会将它重新放入队列中。我可以编写异常代码并处理崩溃,但是我恐怕会错过一些边缘案例。 – SqlRyan 2009-09-02 21:20:44

+1

这正是我们遇到的问题。一旦我们从队列中读取消息,我们如何确保消息不会丢失。 – Balaji 2009-09-02 21:34:52

相关问题