提问者:小点点

无法从SQS骆驼路线中删除消息


我最近有一个关于AWS和骆驼的问题,但最后我还是坚持了下来。现在这个应用程序似乎可以正常工作,但我得到了一个非常奇怪的例外。

首先,我的应用程序分为两个EC2实例。实例一从亚马逊RSSFeed获取前10本书的ISBN,并将其存储到。这是代码片段。

    public static void main(String[] args) throws Exception {

    CamelContext context = new DefaultCamelContext();
    context.addRoutes(new RouteBuilder() {
        public void configure() {

            from(
                    "rss:http://www.amazon.de/gp/rss/bestsellers/books/ref=zg_bs_books_rsslink?splitEntries=false")
                    .split()
                    .method("RssSplitter", "split")
                    .process(new Dummy())
                    .setProperty("isbn", simple("${body}"))
                    .to("aws-sqs://bookz_sqs?accessKey=acceskey&secretKey=secretKey");

        }
    });
    context.start();
    Thread.sleep(10000);
    context.stop();

}

实例二负责读出SQS作为第一个操作,最后从WWW中的oder书库中获取额外的图书信息没有问题,最后构建一个RSSFeeder也没有问题。

public static void main(String[] args) throws Exception {
    /*
     * Here the sqs camel route gets the ISBN out of the queues and stores it in S3.
     */
    CamelContext context = new DefaultCamelContext();
    context.addRoutes(new RouteBuilder() {
        public void configure() {
            from("aws-sqs://bookz_sqs" + "?accessKey=accessKey" + "&secretKey=secretKey").process(new DynamicIsbnEnrich()).process(
                    new DynamicIsbndbEnrich()).process(new DynamicOpLibEnrich()).setHeader(S3Constants.KEY, simple("${property.isbn}")).to(
                    "aws-s3://bookz" + "?accessKey=accesKey" + "&secretKey=secretKEy" + "&region=eu-west-1");

        }
    });
    context.start();
    Thread.sleep(10000);
    context.stop();
}

现在的问题是奇怪的异常,我不明白,除了SQS没有从我的队列中删除消息,但是api说deleteAfter Read默认为true。

2012-12-17 19:45:08,335[Camel(camel-1)线程#0-aws-sqs://team09bookz_sqs]WARNorg.apache.camel.component.aws.sqs.sqs使用者-删除消息时发生错误…由:[com.amazonaws.Amazon ServiceException-请求必须包含参数MessageHandle。]状态码:400,AWSService:Amazon SQS,AWSRequestID:0655aa05-ad6f-5571-a83d-e34cc7196343,AWSError Code:MissingParameter,AWSError Message:请求必须包含参数MessageHandle。

该应用程序有效,但我无法删除队列中的任何消息,我不知道为什么,我需要一些额外的安全凭据吗?

总之谢谢你的帮助


共2个答案

匿名用户

此错误是由Camel SQSendpoint在输出标头中找不到的消息句柄的空值引起的。发生这种情况时,可能应该添加检查并记录警告…

要解决这个问题,您必须确保SQS生产者设置的标头全部传递到路由的末尾:如果您在某处设置了一个新标头,您还必须从输入中复制这些标头,否则它们会丢失。

匿名用户

我不确定上述内容将如何实现,因此这段代码获取所需的Header并在最后将其设置回来。

from("aws-sqs://aqueue")
.setProperty(SqsConstants.RECEIPT_HANDLE, header(SqsConstants.RECEIPT_HANDLE))

...

.setHeader(SqsConstants.RECEIPT_HANDLE, exchangeProperty(SqsConstants.RECEIPT_HANDLE));