升级Camel AWS至AWS2 SQS后日志出现Header转MessageAttribute警告的问询
从camel-aws升级到camel-aws2后,业务功能正常,但日志持续出现如下警告:
WARN 23652 --- [Camel (camel-1) thread #11 - seda://to-image-queue] o.a.c.component.aws2.sqs.Sqs2Producer : Cannot put the message header key=FileFromFtp, value=/tmp/Y25032_20251126T090838Z7663778454258315714.jpg into Sqs MessageAttribute
此前使用camel-aws无此问题,怀疑camel-aws2会自动将所有消息Header转为SQS的MessageAttribute,想知道:
- 若判断正确,如何阻止该行为?
- 若判断错误,为何现在会尝试添加此前未处理的Header?
相关路由定义:
from(SEDA_TO_IMAGE_QUEUE) .routeId("send-image-to-processing-queue") .log(LoggingLevel.DEBUG, "sending image metadata for camera \${header.$HEADER_CAMERA} to queue") .process().message { this.createPayload(it) } .marshal(jacksonDataFormat) .to("aws2-sqs://{{sqs.queue}}?amazonSQSClient=#sqs-client") .log(LoggingLevel.DEBUG, "sent image \${header." + AWS2S3Constants.KEY + "} to queue")
你的判断正确:camel-aws2的SQS组件默认会将Camel消息的所有Header自动映射为SQS的MessageAttribute,而旧版camel-aws无此默认行为,这就是升级后出现警告的原因。
SQS的MessageAttribute有严格限制:
- 键名长度不能超过256字符
- 值类型仅支持String、Number或Binary,且对应数据有大小限制
- 单个消息的所有MessageAttribute总大小不能超过262144字节
FileFromFtp Header触发警告,大概率是组件默认映射逻辑下,该Header的类型或处理方式不符合SQS的要求。
要阻止自动映射Header到MessageAttribute,有以下几种方法:
方法1:完全禁用Header映射
在aws2-sqs的端点URL中添加transferExchange=false参数,彻底关闭Camel消息Header到SQS MessageAttribute的自动映射:
.to("aws2-sqs://{{sqs.queue}}?amazonSQSClient=#sqs-client&transferExchange=false")
方法2:仅映射指定Header
如果需要保留部分Header作为MessageAttribute,可通过messageAttributeNames参数指定要映射的Header列表,未指定的Header不会被组件尝试转换:
// 示例:仅映射$HEADER_CAMERA这个Header .to("aws2-sqs://{{sqs.queue}}?amazonSQSClient=#sqs-client&messageAttributeNames=$HEADER_CAMERA")
方法3:显式移除不需要的Header
在路由中直接移除不需要的Header,避免组件尝试处理它们:
from(SEDA_TO_IMAGE_QUEUE) .routeId("send-image-to-processing-queue") .log(LoggingLevel.DEBUG, "sending image metadata for camera \${header.$HEADER_CAMERA} to queue") .process().message { this.createPayload(it) } .marshal(jacksonDataFormat) .removeHeader("FileFromFtp") // 移除触发警告的Header .to("aws2-sqs://{{sqs.queue}}?amazonSQSClient=#sqs-client") .log(LoggingLevel.DEBUG, "sent image \${header." + AWS2S3Constants.KEY + "} to queue")
内容的提问来源于stack exchange,提问作者UncleBob

