【发布时间】:2014-09-03 12:15:16
【问题描述】:
我正在开发一个 RESTfull Web 服务,它执行以下操作:
- 在 POST 请求时,它会启动一个长时间运行的任务。它为 MSMQ 排队消息,该消息在 Windows 服务托管应用程序中处理。它返回 HTTP 状态代码 202 Accepted 以及我们排队的作业的 ID。
- 客户端应用程序不断轮询服务(使用 GET),其 ID 为我们刚刚排队的作业。当 MSMQ 客户端完成任务后,它应该返回操作结果。如果不是,它将返回 202 Accepted 并带有适当的到期日期以进行下一次推荐的投票。
我的问题是:我应该如何实现从 MSMQ 到 Web 服务的通信?具体来说,我的 Web 服务如何知道消息是否由 MSMQ 客户端处理?
我的第一个想法是在 SQL 数据库中有一个“作业”表,其中包含一个 JobId、一个指示作业是否完成的标志和一个计算结果。然后,MSMQ 应用程序将在完成作业时写入此表,而 Web 服务将在每个请求上查询数据库以获取作业的状态。我不太喜欢这种方法,因为我的 Web 服务不会使用 SQL 服务器,否则工作的结果是幂等的(但很耗时),我不打算以任何方式保存它返回的数据。
我想知道是否有更惯用的方法来解决这个问题,因为这是我第一次处理 MSMQ 或一般的消息队列。
【问题讨论】:
-
您将需要某种持久存储来在 MSMQ 和 Web 服务之间进行通信。即使您对 MSMQ 消息处理器进行编码以使用结果回调 Web 服务,该服务仍然需要保留结果,以便在发出下一个请求时将它们返回给客户端应用程序。对我来说,使用数据库听起来是正确的方法。
标签: web-services rest message-queue msmq