Spring Boot Apache Camel中如何判断Filter未匹配输入?
解决方案:记录未匹配任何Filter的文件
针对你的需求,有两种常用方式实现未匹配文件的日志记录:
方法一:使用choice() + otherwise()(推荐)
Camel的choice()结构天生适配多分支匹配场景,otherwise()会在所有when条件都不满足时触发,刚好对应“未匹配任何filter”的情况。改写后的路由代码如下:
@Override public void configure() throws Exception { // @formatter:off from("file://data/inputdir") .log("Checking ${file:name}") .choice() .when(simple("${file:ext} == 'jpg'")) .to("file://data/outputidr/valid") .log("Processed in JPG! ${file:name}") .when(simple("${file:ext} == 'txt'")) .to("file://data/outputidr/validtxt") .log("Processed in TXT! ${file:name}") .otherwise() .log("${file:name} is not processed") .end() // @formatter:on }
这种方式逻辑清晰,代码结构紧凑,避免了多个独立filter带来的流程分散问题。
方法二:通过属性标记处理状态
如果需要保留原有filter结构,可以通过设置Exchange属性标记文件是否被处理,最后根据属性值判断是否记录日志:
@Override public void configure() throws Exception { // @formatter:off from("file://data/inputdir") .log("Checking ${file:name}") // 初始化标记:未处理 .setProperty("isProcessed", constant(false)) .filter(simple("${file:ext} == 'jpg'")) .to("file://data/outputidr/valid") .log("Processed in JPG! ${file:name}") .setProperty("isProcessed", constant(true)) .end() .filter(simple("${file:ext} == 'txt'")) .to("file://data/outputidr/validtxt") .log("Processed in TXT! ${file:name}") .setProperty("isProcessed", constant(true)) .end() // 判断是否未处理 .filter(simple("${property.isProcessed} == false")) .log("${file:name} is not processed") .end() // @formatter:on }
这种方式灵活性更高,适合后续需要扩展更多处理分支的场景。
内容的提问来源于stack exchange,提问作者watanayz
相关产品推荐
相关产品推荐

