我最近有一个关于 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" + "®ion=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。
该应用程序有效,但我无法删除队列中的任何消息,我不知道为什么,我是否需要一些额外的安全凭证?
无论如何,谢谢你的帮助
答案 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));