如何在Apache Camel中停止拆分器?

csga3l58  于 2022-11-07  发布在  Apache
关注(0)|答案(1)|浏览(220)

我在Apache Camel工作了一段时间,发现了拆分器的功能。我想知道为什么我不能在某些条件下停止整个拆分过程?在谷歌上搜索了几个小时后,我没有找到任何关于它的信息。我唯一找到的是stopOnException()stopOnAggregateException()。但是如果我想在某些特定的异常或甚至取决于消息数据的某些条件下停止它该怎么办?谁能告诉我怎么做?
让我们考虑一下代码的和平

from("timer://file-poll?period=5s")
    .onException(Exception.class)
        .log(LoggingLevel.ERROR, "Error message")
        .end()
    .to("direct:load-file")        // load csv
    .split(body()).delimiter("\n") // split file into lines
        .to("direct:process-line") // throws exceptions
    .end()
    .to("direct:save-result");

我轮询文件系统并加载一个1,000行的csv文件。
然后,我将文件拆分为多行,并分别处理每一行。
direct:process-line路由可以抛出异常,如果它抛出LineProcessingException,我需要跳过该行并继续处理下一行,但如果它抛出任何其他异常,我需要停止拆分器。

**例如:**行程第15行会掷回LineProcessingException,我会略过这一行,并继续行程其馀的985行。

处理第30行会抛出IOException,因此现在我需要停止处理剩下的970行,并转到direct:save-result路由。
我尝试了stopOnException()stopOnAggregateException(),但正如我上面所说的,它在出现任何异常时都会停止拆分器,如果抛出了LineProcessingException,我不需要停止拆分器,只需跳过该行。我还尝试在处理该行的子路由上调用stop(),但它只停止子路由,而不停止拆分器。

pb3skfrl

pb3skfrl1#

我仍然不相信过滤是一个坏的选择。如果你能识别和忽略无效数据的前期(如你的问题所暗示的)过滤是非常优雅的。
下面是两个例子,如何跳过已知无效的数据,从而避免出现一个异常。希望它能给你一些新的思路来处理真实的的问题。
第一个
运行此示例时,将记录以下正确输出:

MainRoute                      INFO  MainRoute BEGINS: BODY: 100
200
300
BOOM
400
processRecord1                 INFO  processing record 100
processRecord2                 INFO  processing record 100
processRecord1                 INFO  processing record 200
processRecord2                 INFO  processing record 200
processRecord1                 INFO  processing record 300
processRecord2                 INFO  processing record 300
processRecord1                 INFO  processing record 400
processRecord2                 INFO  processing record 400
MainRoute                      INFO  MainRoute ENDS: BODY: 100
200
300
BOOM
400

相关问题