我有一个非常简单的方法,从一个目录中获取文件并将其发送到一个bean:onException().redeliveryDelay(10000);在MyProcessor.class中可能会发生异常,因此我想再次延迟处理该文件。onException().redeliveryDelay(10000);个但是它没有工作,并且在异常之后,同一个文件将被再次处理。
onException().redeliveryDelay(10000);
cetgtptt1#
处理前是否执行了onException()?示例:
onException()
errorHandler(defaultErrorHandler() .maximumRedeliveries(2) .redeliveryDelay(5000) .retryAttemptedLogLevel(LoggingLevel.WARN)); // exception handler for specific exceptions onException(IOException.class).maximumRedeliveries(1).redeliveryDelay(5000); //only the failed record send write to error folder onException(CsvRecordException.class) .to("file:/app/dev/dataland/error"); onCompletion() .log("global thread: ${threadName}") .to("file:/app/dev/dataland/archive"); from("file:/path?noop=true?delay=3000") .startupOrder(1) .log("start to process file: ${header.CamelFileName}") .bean(CsvFilePreLoadChecker.class, "validateMetaData") .end() .log("Done processing file: ${header.CamelFileName}");
xmd2e60i2#
当MyProcessor.class中发生错误时,路由处理失败,因此文件消费者不删除文件。由于路由处理已完成,文件消费者只需再次读取(仍然存在的)文件。如果您想要将有行程错误的档案移走,您可以使用file consumer的moveFailed选项。然后您必须定期将它们移回来重试。如果你想将文件阅读和MyProcessor.class分离,你需要将路由分成2个路由。一个路由读取文件并将其消息发送到队列或类似的队列。另一个路由使用该队列并处理消息。
MyProcessor.class
moveFailed
2条答案
按热度按时间cetgtptt1#
处理前是否执行了
onException()
?示例:
xmd2e60i2#
当
MyProcessor.class
中发生错误时,路由处理失败,因此文件消费者不删除文件。由于路由处理已完成,文件消费者只需再次读取(仍然存在的)文件。
如果您想要将有行程错误的档案移走,您可以使用file consumer的
moveFailed
选项。然后您必须定期将它们移回来重试。如果你想将文件阅读和
MyProcessor.class
分离,你需要将路由分成2个路由。一个路由读取文件并将其消息发送到队列或类似的队列。另一个路由使用该队列并处理消息。