场景 1:在故障事件中,我正在重新启动服务,这意味着重新创建 ServiceHost。
我已经实现了 IErrorHandler 来处理毒消息,并且在将毒消息移动到毒队列之后,它调用了 RestartService 方法。
现在,当消息中毒时,首先调用故障事件,该事件调用 RestartService 但在成功打开 ServiceHost 后很快它再次出现故障,但在这里我已经处理停止进一步重新启动它。
在此期间,IErrorHandler.HandleError 在单独的线程上被调用两次,一次它无法找到要移动到毒物队列的消息,第二次调用将消息移动到毒物队列,如果异常是 MsmqPoisonMessageException,则在每次调用 IErrorHandler.HandleError 结束时它将重新启动服务。
以下是被调用的方法序列:
ProcessMessage – message throws exception every time e.g. DB server is down
ServiceHost.Faulted
RestartService
ServiceHost.Faulted
RestartService – skipped as still first call to RestartService not finished
IErrorHandler.HandleError - Message not found to move to poison queue
RestartService
IErrorHandler.HandleError - Message moved to poison queue
RestartService – skipped as a call to RestartService by first call to IErrorHandler.HandleError is not yet finished
场景 2:在故障事件中,我没有重新启动服务。
以下是被调用的方法序列:
ProcessMessage – message throws exception every time e.g. DB server is down
ServiceHost.Faulted
IErrorHandler.HandleError - Message moved to poison queue
RestartService
现在我担心的是,如果我遵循更干净且性能更佳的场景 2,但如果服务因除 MsmqPoisonMessageException 以外的任何其他原因而出现故障,服务将停止响应。
在这种情况下,您建议什么解决方案?
我在 Windows XP 和 Windows Server 2003 上使用 MSMQ 3.0。