0

场景 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。

4

1 回答 1

0

对于 MSMQ 3,我们看到在 FaultHandler 中重新启动服务不是一个好主意,因为它可能会导致在消息被移动到毒队列之前重新处理消息。

如果在处理毒消息之前重新启动服务(这将发生,因为它会发生故障 -> 在引发毒消息异常之前引发故障事件),新的服务主机可能会开始处理该消息并且毒处理无法找到中毒消息。

我看到的问题是:如果 WCF 服务出现异常和故障怎么办?

于 2013-06-06T13:22:05.580 回答