您好我正在使用apache camel 2.15.2。我有一个消费者模板,以便我可以使用动态文件名复制文件:
if (fileInfo != null) {
filename = fileInfo.getFileName();
String camelUri = "file://" + fileInfo.getCopyFilePath() + "/?fileName=RAW("
+ filename + ")&noop=false&idempotent=false&readLock=changed";
System.out.println("Camel uri: " + camelUri);
logger.info("Camel uri: " + camelUri);
Exchange ex = consumerTemplate.receive(camelUri);
....
正如您所看到的,我已经设置了noop和idempotent,以实现多次复制同一个文件。但是,它没有那样做。它挂起在receive方法上,以便后续尝试复制具有相同名称的文件。只有在我们重新启动应用程序时,它才能复制它。任何建议将不胜感激。它可能与此issue类似,但我无法访问该解决方案。提前谢谢。
当我通过Camel代码进行调试时,它似乎调用了EventDrivenPollingConsumer的receive方法,并在调用queue.take()(第110行,EventDrivenPollingConsumer)时挂起。而且,即使在里面,也要计算' ArrayBlockingQueue中的变量为零:
while (count == 0)
notEmpty.await();
添加了这个,以防它有助于任何人有线索。
答案 0 :(得分:0)
好的,如果我调用'consumerTemplate.doneUoW(ex)',它会复制多次。但是,同时它正在删除(实际上移动到.camel文件夹)源文件,我不想这样做!然后,必须设置noop = true:
if (fileInfo != null) {
filename = fileInfo.getFileName();
String camelUri = "file://" + fileInfo.getCopyFilePath() + "/?fileName=RAW("
+ filename + ")&noop=true&idempotent=false&readLock=none";
System.out.println("Camel uri: " + camelUri);
logger.info("Camel uri: " + camelUri);
Exchange ex = consumerTemplate.receive(camelUri);
// consumerTemplate.r
logger.info("File received: " + fileInfo.getFileName());
exchange.getOut().setBody(ex.getIn().getBody());
consumerTemplate.doneUoW(ex);
}
现在,它按预期工作。