持久性Client-Side失败

在某些情况下, 消息队列 可以将消息移动到目标队列。 例如,如果队列访问控制不允许将消息从客户端移动到服务器,则冒犯消息将移动到客户端死信队列。 发生这种情况时,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 读取消息队列事务死信队列上的每条消息,并实例化每个排队组件消息的异常类。 一次通过队列后,它会等待新消息。 然后,它会在到达时处理每个新的死信队列消息。

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

客户端错误

服务器端错误