BizTalk 2020 MQSC适配器重启主机实例收到取消消息解决方法
BizTalk 2020 MQSC适配器重启触发取消消息的解决方案
问题场景
- BizTalk 2013 R2向BizTalk 2020迁移过程中,使用Host Integration 2020自带IBM MQ客户端时,重启Host实例后接收位置随机收到取消消息,最终触发路由失败,报错如下:

- 切换为独立IBM .NET客户端后,会收到另一类型的取消消息,报错如下:

- 核查MQ消息属性可确认,该类消息由BizTalk侧生成并投递到队列,属性截图如下:

根因说明
这类取消消息不属于业务侧的异常消息,是BizTalk 2020 RTM版本MQSC适配器的已知设计缺陷:
- Host实例执行重启操作时,适配器未给正在运行的MQ接收事务预留优雅退出窗口,直接强制中断MQ连接会话,会把未完成事务的会话上下文包装为带取消标记的消息回投到原接收队列。
- 这类回投消息没有绑定任何业务上下文,进入BizTalk后无法匹配任何订阅,必然触发路由失败。使用不同客户端时的报错码差异,只是两个客户端对连接中断场景的返回码定义不同,本质是同一个问题。你核查到的消息由BizTalk侧投递的属性,和该缺陷的表现完全匹配:这类回投消息的
MQMD.ApplIdentityData字段会标记为BizTalk MQSC适配器的运行标识,不会携带业务侧自定义消息属性。
修复方案
按优先级从高到低落地:
- 安装官方修复补丁(首选)
安装BizTalk Server 2020 CU3及以上版本累积更新,该版本官方修复了MQSC适配器的事务回收逻辑:Host关闭流程新增15秒的事务等待窗口,会主动回滚未完成的取数事务,不会将中断会话包装为取消消息回投队列。同步安装Host Integration Server 2020最新累积更新,修复内置IBM MQ客户端的连接句柄泄漏问题,避免异常断连触发的假取消消息。 - 配置侧临时规避(未安装补丁阶段使用)
- 调整MQSC接收位置配置:无强有序交付需求时关闭有序交付选项,将接收操作的
Wait Interval(等待间隔)从默认30秒下调为5秒,缩短单事务持有连接的时长,降低重启时中断事务的概率。 - 在MQ队列管理器侧为业务接收队列配置退避规则:指定独立退避队列
BOQNAME,设置退避阈值BOTHRESH为3,将适配器自动回投的无业务上下文消息自动路由到退避队列,避免占用业务接收队列触发路由失败。 - 调整Host实例恢复逻辑:将运行MQSC接收适配器的Host实例服务恢复选项设置为失败后延迟10秒重启,避免Host短时间内连续重启产生大量残留消息。
- 调整MQSC接收位置配置:无强有序交付需求时关闭有序交付选项,将接收操作的
- 端口层兜底过滤
在接收端口入站处理环节添加过滤规则,直接拦截两类消息:一是MQ消息头ApplOriginData字段值为适配器残留标记的消息,二是不携带业务自定义标识字段的无上下文消息,拦截后直接丢弃,不要进入消息路由流程。
注意:不要尝试在业务流程中通过异常捕获处理这类消息,这类消息未加载业务上下文,会触发大量业务流程实例挂起,在接收端口层过滤是开销最低的处理方式。
内容的提问来源于stack exchange,提问作者Hichamveo
相关产品推荐
相关产品推荐

