客户端永久性故障

在某些情况下,消息队列可以将消息移动到目标队列。 例如,如果队列访问控制不允许将消息从客户端移动到服务器,则有问题的消息将移动到客户端死信队列。 发生这种情况时,COM+ 排队组件服务允许异常类与组件相关联。 若要将异常类与组件相关联,请使用组件服务管理工具的组件属性页中的高级选项卡。 还可以使用 COM+ 管理函数的 ExceptionClass 目录组件属性,以编程方式关联异常类。

异常类定义为实现 IPlaybackControl 的组件的 ProgID 或 CLSID。 排队组件服务有一个死信队列监视器,用于扫描 Xact 死信队列。 如果队列上有一条消息,死信队列监视器将实例化与目标组件关联的异常处理程序,并调用 IPlaybackControl::FinalClientRetry,指示存在客户端不可恢复的错误。

除了 IPlaybackControl,异常处理程序还应实现与处理异常的服务器组件相同的接口集。 调用 IPlaybackControl::FinalClientRetry 时,排队组件运行时向异常处理程序回放失败消息。 这样,异常处理程序就可以为无法移动到服务器的消息实现替代行为,例如,通过生成补偿事务。

如果异常处理程序完成了所有回放的方法调用,则消息将从 Xact 死信队列中删除并被忽略。 但是,如果异常处理程序通过从其中一个方法调用返回失败状态来中止消息,则会将消息返回到 Xact 死信队列。 以下事件序列显示了如何处理客户端异常:

  1. 消息队列无法将消息传递到服务器,并将消息置于 Xact 死信队列中。
  2. 死信队列侦听器 (DLQL) 在 Xact 死信队列中查找消息。
  3. DLQL 从消息中检索目标组件 CLSID,并检查异常类。
  4. DLQL 实例化异常类。
  5. 针对异常类的 IPlaybackControl 的 DLQL 查询。
  6. DLQL 在异常类中调用 IPlaybackControl::FinalClientRetry 方法。
  7. DLQL 将消息中的所有属性和方法调用回放到异常类。
  8. 如果异常处理程序成功完成事务,则 DLQL 将删除该消息。 异常处理程序可能会发出 IObjectContext::SetAbort,消息将保留在死信队列中。

如果上述任一步骤失败,消息将保留在 Xact 死信队列中。

启动时,DLQL 读取消息队列事务死信队列上的每条消息,并实例化每个排队组件消息的异常类。 在一个消息通过队列后,它等待新的消息。 然后,它在每个新的死信队列消息到达时对其进行处理。

如果需要干预此处介绍的过程,或者如果需要将有害消息从其最终休息队列中移出,请使用消息移动器实用工具。 有关消息移动器实用工具的详细信息,请参阅处理错误

客户端错误

服务器端错误