7

我最近有一个关于AWSCamel的问题,但最后我还是坚持了下来。现在该应用程序似乎可以正常工作,但是我遇到了一个非常奇怪的异常。

首先,我的应用程序分为两个 EC2 实例。实例一从 Amazon RSS Feed 中获取前 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 中的其他 Booklibraries 中获取额外的 Book 信息没有问题,最后构建一个 RSS Feeder 也没有问题。

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] 警告 org.apache.camel.component.aws.sqs.SqsConsumer - 删除消息时出错。 . 引起:[com.amazonaws.AmazonServiceException - 请求必须包含参数 MessageHandle。] 状态代码:400,AWS 服务:AmazonSQS,AWS 请求 ID:0655aa05-ad6f-5571-a83d-e34cc7196343,AWS 错误代码:MissingParameter, AWS 错误消息:请求必须包含参数 MessageHandle。

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

无论如何感谢您的帮助

4

2 回答 2

8

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

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

于 2013-07-31T09:06:15.637 回答
3

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

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

...

.setHeader(SqsConstants.RECEIPT_HANDLE, exchangeProperty(SqsConstants.RECEIPT_HANDLE));
于 2016-12-15T11:27:09.197 回答