以下是路线:
from("aws-sqs://myQueue?accessKey=RAW(xxx)&secretKey=RAW(yyy)&deleteAfterRead=false")
.log("Attributes: ${header.CamelAwsSqsAttributes}")
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
Map<String, String> messageAttributes = (Map<String, String>) exchange.getIn().getHeader("CamelAwsSqsAttributes");
...
}
});
. log()
显示一个空映射,就像我从处理器打印message ageAtbantes
一样。
我还尝试了使用标头“CamelAwsSqsMessageAt的属性”
而不是“CamelAwsSqs的属性”
,但仍然一无所获。
不过,我从AWS
控制台看到了属性。
顺便说一下,我得到了消息体,我使用了骆驼2.15
我想通了,这里是一个获取队列属性和消息属性的示例:
main.bind("sqsAttributeNames", Collections.singletonList("All"));
main.bind("sqsMessageAttributeNames", Collections.singletonList("All"));
或者如果您不使用org. apache.camel.main.Main
,则将这些对象添加到注册表中,然后:
from("aws-sqs://myQueue?accessKey=RAW(xxx)&secretKey=RAW(yyy)&deleteAfterRead=false&attributeNames=#sqsAttributeNames&messageAttributeNames=#sqsMessageAttributeNames")
当然,如果您不想要所有属性,您可以将Collection. singletonList("All")
替换为所需的属性列表。
我遇到了同样的问题。当我使用camel-aws 2.16. x并且我的endpoint配置如下
from("aws-sqs://myQueue?...&messageAttributeNames=#sqsMsgAttributeNames")
.to(...)
然后我在我的Spring配置文件中定义了一个字符串集合
@Bean
public Collection<String> sqsMsgAttributeNames() {
return Arrays.asList("Attr1", "Attr2");
}
上述设置工作正常,但自从我升级到camel-aws 2.17.3。它不再起作用。正如骆驼SQS组件中提到的,消息属性名称不再支持字符串集合,它应该是一个用逗号分隔属性的字符串。
注意:包含属性的字符串不应该包含任何空格,否则驼峰组件只会读取第一个属性。我为此进行了痛苦的调试。此外,将属性值设置为“全部”对我不起作用,不会读取任何消息属性。
以下是我所做的更改,这些更改允许骆驼的Sqs消费者再次工作:
@Bean
public String sqsMsgAttributeNames() {
return String.format("%s,%s", "Attr1", "Attr2");
}
这不是骆驼的问题。它可以是SQS
或aws-java-sdk-core
库的默认行为。作为一个快速的解决方案,可以使用这个aws-sqs
URL
aws-sqs://myQueue?<other attributes here>&attributeNames=All
请记住,与SQS不同,localack
在没有属性名称
参数的情况下也可以很好地工作。