Server-Side 错误
侦听器和玩家共同处理有害消息。 如果正在播放的事务失败,消息队列 将输入消息移回输入队列。 如果玩家从服务器组件收到失败的 HRESULT 或捕获异常,则玩家中止事务。 如果问题仍然存在,侦听器可以按以下模式连续循环:
- 取消消息排队
- 实例化对象
- 遭受回滚
- 将消息放回队列顶部
排队的组件服务使用一系列特定于应用程序的重试队列来处理此失败。 在安装组件时创建,每个应用程序都有七个队列,如下所示:
普通输入队列。 此队列的名称是 COM+ 应用程序名称。 这是消息队列公共队列。
第一个重试队列。 如果事务在处理来自正常输入队列的消息时反复失败,则会在此处移动消息。 此队列的消息在一分钟后处理。 在移动到第二个重试队列的后部之前,可以重试此队列的三次消息。 此队列 ApplicationName_0 命名。 此队列是专用消息队列队列。
第二个重试队列。 如果事务在处理来自第一个重试队列的消息时反复失败,则会在此处移动消息。 此队列的消息在两分钟后处理。 在移动到第三个重试队列的后部之前,可以重试此队列的三次消息。 此队列 ApplicationName_1 命名。 此队列是专用消息队列队列。
第三个重试队列。 如果事务在处理来自第二个重试队列的消息时反复失败,则会在此处移动消息。 此队列的消息在四分钟后处理。 在移动到第四个重试队列的后部之前,可以在此队列上重试三次消息。 此队列 ApplicationName_2 命名。 此队列是专用消息队列队列。
第四个重试队列。 如果事务在处理来自第三个重试队列的消息时反复失败,则会在此处移动消息。 此队列的消息在 8 分钟后处理。 在移动到第五个重试队列之前,可以在此队列上重试三次消息。 此队列 ApplicationName_3 命名。 此队列是专用消息队列队列。
第五个重试队列。 如果事务在处理来自第四个重试队列的消息时反复失败,则会在此处移动消息。 此队列的消息在 16 分钟后处理。 在移动到最终的休息队列之前,可以在此队列上重试三次消息。 此队列 ApplicationName_4 命名。 这是专用消息队列队列。
特定于应用程序的最终休息队列。 如果在第五个重试队列上尝试事务时重复中止,则会在此处移动消息。 此队列 ApplicationName_DeadQueue 命名。 这是专用消息队列队列。 最终的休息队列不是由队列侦听器提供服务。 消息将保留在此处,直到手动移动消息(可能是由排队组件消息移动器实用工具移动),或被消息队列资源管理器清除。
无法播放的消息,因为很明显,每次重试尝试都将失败直接移动到特定于应用程序的最终休息队列,而无需通过所有重试级别进行高级。
玩家发出 COM+ 事件以通知相关方无法播放消息。 在以下情况下发出 COM+ 事件:
- 事务中止时
- 将消息从一个队列移动到另一个队列时
- 将消息存入最终休息队列时
在从一个队列移动到另一个队列之前,可以修改消息。 COM+ 排队组件安全机制允许移动消息以重试队列,然后重新插入应用程序的初始输入队列。 有关排队组件安全性的详细信息,请参阅 排队组件安全性。
当应用程序被标记为由组件服务管理工具排队或使用 COM+ 管理 SDK 函数排队时,会连同主应用程序队列一起创建重试队列。 队列组件服务允许通过允许删除重试队列来灵活地使用重试机制。 例如,如果删除了所有重试队列,则会将永久中止的消息直接从应用程序队列移动到特定于应用程序的最终休息队列。 通过删除一个或多个重试队列,可以减少重试次数和长度。 如果从重试序列中删除队列,剩余队列的计时与重试队列序列中的位置相对应。 例如,如果删除 ApplicationName_1 的重试队列,ApplicationName_2,ApplicationName_3,则 ApplicationName_4 上的消息将像队列是第二个重试队列一样进行处理。
重试机制旨在尽可能完成消息。 在某些情况下,消息可能无法成功。 例如,客户可能试图从资金不足的帐户提取资金。 在这些情况下,可以通过多种方式处理错误,包括以下内容:
- 生成诊断并发出警告
- 创建补偿事务
- 忽略问题并消除消息
与客户端永久性故障一样,排队组件服务允许异常类与组件相关联。 异常类通过使用组件服务管理工具的组件属性页中的“高级”选项卡或使用 COM+ 管理功能与组件相关联。 异常类允许开发人员控制在重试消息之后以及该消息移动到应用程序特定的最终休息队列之前。 有关异常类的详细信息,请参阅 持久 Client-Side 故障。
下面是服务器端异常处理的事件序列:
- 该消息通过可用的特定于应用程序的重试队列移动。
- 上次重试队列的最后一次重试失败。
- 排队组件服务运行时从消息中检索目标组件,并检查异常类。
- 运行时实例化异常类。
- 运行时查询 异常类上的 IPlaybackControl。
- 运行时调用 异常类中的 IPlaybackControl::FinalServerRetry。
- 运行时播放从消息到异常类的所有属性和方法调用。
- 如果步骤 4 到 6 不成功,运行时会将消息移动到特定于应用程序的最终休息队列。
如果需要干预上述过程,或者需要将病毒消息移出其最终休息队列,请使用消息移动器实用工具。 有关消息移动器实用工具的详细信息,请参阅 处理错误。
相关主题