提问者:小点点

骆驼不检索SQS消息属性


以下是路线:

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


共3个答案

匿名用户

我想通了,这里是一个获取队列属性和消息属性的示例:

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");
}

匿名用户

这不是骆驼的问题。它可以是SQSaws-java-sdk-core库的默认行为。作为一个快速的解决方案,可以使用这个aws-sqsURL

aws-sqs://myQueue?<other attributes here>&attributeNames=All

请记住,与SQS不同,localack在没有属性名称参数的情况下也可以很好地工作。