无法从SQS Camel Route中删除消息

时间:2012-12-17 19:15:54

标签: apache-camel amazon-sqs

我最近有一个关于 AWS Camel 的问题,但最后我一直在努力。现在该应用程序似乎工作,但我得到一个非常奇怪的例外。

首先,我的应用程序分为两个EC2实例。实例1从亚马逊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中的oder 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不是从我的队列中删除消息,但是默认情况下,deleteAfter Read是真的。

  

2012-12-17 19:45:08,335 [Camel(camel-1)thread#0 - aws-sqs:// team09bookz_sqs] WARN 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。

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

无论如何,谢谢你的帮助

2 个答案:

答案 0 :(得分:6)

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

要解决此问题,您必须确保SQS生成器设置的标头全部传递到路径的末尾: 如果你在某个地方设置一个新的标题,你还必须复制输入中的标题,否则它们就会丢失。

答案 1 :(得分:2)

我不确定上面是如何实现的,所以这段代码抓住了所需的Header并在最后重新设置它。

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

...

.setHeader(SqsConstants.RECEIPT_HANDLE, exchangeProperty(SqsConstants.RECEIPT_HANDLE));
相关问题