浏览死信队列(DLQ)时出现MQRC 2080错误,寻求技术支持
解决MQ DLQ浏览时的2080(MQRC_TRUNCATED_MSG_FAILED)错误
我经常碰到用户在用amqsbcg工具浏览死信队列(DLQ)时遇到这个错误,咱们一步步拆解问题和解决方案:
错误原因解析
MQRC_TRUNCATED_MSG_FAILED(2080)的核心问题是:你尝试获取的消息大小超过了amqsbcg程序默认分配的缓冲区大小,而且程序没有启用“允许截断消息”的选项,导致MQ拒绝返回不完整的消息,直接触发报错。
amqsbcg是MQ自带的示例程序,它的默认缓冲区大小是固定的(通常在8KB左右),如果DLQ里存在超过这个尺寸的消息,就会触发这个问题。
具体解决方案
方案1:修改并重新编译amqsbcg程序
如果必须使用这个工具,你可以修改源代码来适配大消息:
- 找到
amqsbcg.c文件(通常在MQ安装目录的/opt/mqm/samp/c路径下) - 定位到消息缓冲区的定义行,比如:
把数值改大,比如改成char buffer[8192];65536(64KB)或者更大,匹配你实际的消息大小。 - 在调用
MQGET的代码段中,给GMO(Get Message Options)添加MQGMO_ACCEPT_TRUNCATED_MSG选项,示例:GMO.Options = MQGMO_NO_WAIT | MQGMO_ACCEPT_TRUNCATED_MSG; - 重新编译程序:
- Linux环境:
gcc amqsbcg.c -o amqsbcg -lmqm - AIX环境:
xlc amqsbcg.c -o amqsbcg -lmqm
- Linux环境:
方案2:用更实用的工具处理DLQ
没必要死磕示例程序,MQ提供了更适配的工具:
- MQ Explorer:图形化界面,自动适配消息大小,连接队列管理器后就能直接浏览DLQ的所有消息,操作直观。
- dmpmqmsg命令:可以导出DLQ的消息到文件,默认支持更大的消息尺寸,示例命令:
如果仍有大小问题,用dmpmqmsg -m QM.ABCDEFG -i SYSTEM.DEAD.LETTER.QUEUE -f dlq_messages.txt-maxmsgsize参数指定更大的值,比如:dmpmqmsg -m QM.ABCDEFG -i SYSTEM.DEAD.LETTER.QUEUE -f dlq_messages.txt -maxmsgsize 1048576
方案3:先排查DLQ里的消息大小
先确认DLQ里的消息是否真的过大,用runmqsc命令查询:
runmqsc QM.ABCDEFG
然后执行以下命令:
DISPLAY QLOCAL(SYSTEM.DEAD.LETTER.QUEUE) CURDEPTH MAXMSGL DISPLAY QMGR MAXMSGL
MAXMSGL是队列/队列管理器允许的最大消息大小- 如果发现有消息超过了
amqsbcg的默认缓冲区,就可以针对性调整工具或处理大消息。
额外注意事项
死信队列里的消息之所以被放入DLQ,很可能是因为原队列的MAXMSGL设置太小,导致消息无法正常投递。处理这些消息时,要注意要么调整原队列的MAXMSGL,要么修改消息大小后再重新投递,避免再次触发死信。
内容的提问来源于stack exchange,提问作者Rinak
相关产品推荐
相关产品推荐

