SQS监听器@Headers获取到消息体内容而非消息属性
解决Spring Cloud SQS @Headers无法获取自定义消息属性的问题
我之前也踩过这个坑!Spring Cloud SQS对消息属性的绑定逻辑和我们直觉里的不太一样,你碰到的问题大概率是参数绑定的方式不对,试试下面的方案:
1. 正确获取所有自定义消息属性
Spring Cloud SQS会把你在AWS控制台设置的自定义消息属性统一放到aws_custom_headers这个特殊头里,所以你需要通过@Header("aws_custom_headers")来绑定到Map,而不是直接用@Headers:
@SqsListener("your-target-queue") public void handleMessage(String messageBody, @Header("aws_custom_headers") Map<String, String> customAttributes) { // 这里就能拿到你设置的Key1=Value1了 String value1 = customAttributes.get("Key1"); System.out.println("自定义属性Key1的值:" + value1); }
2. 直接获取单个自定义属性
如果只需要某个特定的属性,不用拿整个Map,直接用@Header指定属性名更简洁:
@SqsListener("your-target-queue") public void handleMessage(String messageBody, @Header("Key1") String key1Value) { System.out.println("Key1的值:" + key1Value); }
3. 排查你之前的问题原因
你说@Headers拿到的是消息体内容,很大可能是因为你把@Headers注解直接绑定到了方法的唯一参数上,框架默认把消息体解析成了这个Map。比如错误的写法:
// 错误示例:这样会把消息体当成headers返回 @SqsListener("your-target-queue") public void handleMessage(@Headers Map<String, Object> headers) { // 这里的headers其实是消息体的解析结果 }
正确的做法是分开声明消息体和头参数,让框架能正确区分两者。
另外建议检查下你的Spring Cloud SQS版本,尽量使用稳定的新版本,避免旧版本的解析bug。
内容的提问来源于stack exchange,提问作者Pankaj Chouhan
相关产品推荐
相关产品推荐

