Apache Camel File组件异常处理与任务终止配置咨询
Apache Camel 路由异常处理配置方案
问题a:文件行数异常时重命名并移动至处理目录
修改原有的行数异常处理器,添加文件重命名移动逻辑:
onException(TooManyLinesException.class, NoLinesException.class) .handled(true) .log("File LineLimitErr: ${header.CamelFileName}") // 动态指定目标路径,将文件重命名为[原文件名].err后移至PROCESSED_FOLDER .toD("file://" + PROCESSED_FOLDER + "?fileName=${file:name}.err");
handled(true)会标记异常已处理,中断原路由流程,避免执行file组件默认的move配置- 使用
toD实现动态路径拼接,${file:name}变量会自动带入原文件名,确保重命名准确
问题b:API调用异常时终止批次并留待下次重试
新增API异常处理器,配置批次终止逻辑:
// 建议替换为API调用抛出的具体异常类(如RemoteApiException),避免捕获无关异常 onException(Exception.class) .log("API调用失败,终止本次批次处理: ${header.CamelFileName}") .stopOnException(true);
stopOnException(true)会立即终止当前poll批次中剩余文件的处理,直接结束本次Cron触发的任务- 不设置
handled(true),异常会传播至file组件,组件不会执行move操作,失败文件将留在inputFolder,等待下次Cron任务触发时自动重试
完整修改后的路由代码
public void configure() throws IOException { // 处理文件行数异常:重命名为.err并移至处理目录 onException(TooManyLinesException.class, NoLinesException.class) .handled(true) .log("File LineLimitErr: ${header.CamelFileName}") .toD("file://" + PROCESSED_FOLDER + "?fileName=${file:name}.err"); // 处理API调用异常:终止本次批次,留待下次重试 onException(Exception.class) // 替换为具体API异常类更佳 .log("API调用失败,终止本次批次处理: ${header.CamelFileName}") .stopOnException(true); from("file://" + inputFolder + "?includeExt=dat" + "&eagerMaxMessagesPerPoll=true&maxMessagesPerPoll=100&preSort=true" + "&move=" + PROCESSED_FOLDER + "/${file:name}" + "&initialDelay=" + initialDelay + "&scheduler=spring&scheduler.cron=" + cronExpression + "+?") .log(LoggingLevel.INFO, "Incoming read FileName: ${headers.CamelFileName}") .log(LoggingLevel.INFO, "File Read: \n ${body}") .bean(CreateMessageRequest.class) // 修正Bean调用方式:Camel需通过bean:前缀指定Bean,确保Bean已注册到上下文 .to("bean:" + SendRequestToAPI.class.getName()) .end(); }
内容的提问来源于stack exchange,提问作者Vikrant
相关产品推荐
相关产品推荐

