如果Msmq关闭并且您的asp.NET应用程序依赖它,该怎么办?

时间:2010-08-12 13:34:02

标签: msmq

我有一个Flex应用程序,向候选人显示评估。在评估结束时,asp.NET应用程序将(候选)id的会话发送到队列。另一台机器上的Windows服务处理队列并执行一些作业。

现在,如果由于某种原因msmq关闭,那么会话ID将不会被发送到队列并且将抛出异常。我可以抓住它,但该怎么办呢?

  • 将这些会话ID存储在数据库中的一个表中(很容易编写一些重试将这些消息发送到队列的逻辑)
  • 只记录错误(之后很难重试所有失败的消息 - 需要在日志中读取)

!Msmq不用于Flex的服务请求,因此即使msmq关闭,应用程序也会继续运行。

3 个答案:

答案 0 :(得分:1)

这真的是一个商业决策,所以YMMV。我倾向于提倡这种方法:

1)记录所有必要的内容(如果可能,包括消息体),以便稍后重新提交消息。然而,存储。我会继续使它成为一个异常数据库,这样你也可以记录失败的时间,确切的异常(如果问题是MSMQ已关闭,但其他东西爆炸了)等。
2)拥有某种通知系统,该系统将通知所有相关方(业务流程所有者,支持以及MSMQ负责人)的故障以及足够的识别信息,以便在异常数据库中查找记录的消息。

答案 1 :(得分:1)

将所有会话ID存储在数据库的表中,并让另一台计算机上的Windows服务读取此表中的ID(完全绕过消息队列)。

答案 2 :(得分:1)

因此Flex在网页上托管在客户端上?因此,它是否正在与服务器进行通信,而服务器又将消息发布到队列中。或者直接使用HTTP灵活地发布到q。如果它是后者(flex直接与q通信)那么如果q关闭则你可以做很多事情。

如果flex正在与与q通信的服务器通话,那么你有几个选择。你可以完全按照你说的做,但是你需要一个单独的进程来读取离线数据存储并在q出现后处理消息的发布。如果q托管在服务的另一台服务器上,你可以设置一个本地q(应该始终可用,然后将它复制到remove q当它可用时(因此msmq技术处理网络停机时间,等)。

或者你可以按照'@MusiGenesis'的答案完全绕过队列,如果它实际上不需要的话。