处理时需要结束Apache camel拆分

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

我的目的是一个一个地发送消息列表(消息是使用数据库中的值生成的)。我所做的是查询并获取消息列表,将其附加到交换中,并使用split来滑动消息,然后发送
下面是我的路线

.process(this::analyseSettlement)
    .choice()
        .when()
            .simple("${header.error_reason} == 001")
            .log("Settlement Completed")
        .otherwise()
            .log("BatchUpload process")
            .split(body(), flexible().accumulateInCollection(ArrayList.class))
                .setHeader(Exchange.HTTP_METHOD).constant(HttpMethod.POST)
                .removeHeader(Exchange.HTTP_PATH)
                .marshal().json(JsonLibrary.Jackson)

                .to("http://localhost:8087/channel/tcp?bridgeEndpoint=true")
                // analyze response if success then update the table 
                // if not return error
                .unmarshal(new JacksonDataFormat(InternalTransactionBean.class))
                .process(this::analyseBatchUploadResponse)

                .end()
            .log("${body}")
            .process(this::processPostSettlement)

我所需要的是,如果我在其中一个响应中发现错误,需要停止发送所有未发送消息,结束拆分并转到postProcesssettlement函数
所需流量-〉

Message list->  

            send message 1 by one
            error occurred while processing one message 
            stop processing the rest of the messages and exit the route

如何实现这一点或如果我的过程中发送批量消息是不正确的,请建议我有关。

cdmah0mi

cdmah0mi1#

在Camel路由中实现所需功能的一种方法是使用EIP doTrydoCatchdoFinally,这与Java中与stopOnException相关的著名try-catch-finally块非常相似,以便在出错时中断split的执行。
在下面的示例中,我模拟了对文件内容的逐行验证失败,然后在doCatch块中捕获到异常时执行一些操作,最后执行doFinally块中发生的任何其他操作

from("file:src/data")
    .doTry()
        .split(body().tokenize("\n")).stopOnException()
            .log("In split ${body}")
            .throwException(new RuntimeException("Not good"))
        .end()
    .endDoTry()
    .doCatch(RuntimeException.class)
        .log("In catch: ${body}")
    .doFinally()
        .log("In finally: ${body}")
    .end();

假设我的文件的内容是:

line 1
line 2
line 3

我的路线的结果是:

In split line 1
In catch: line 1
line 2
line 3
In finally: line 1
line 2
line 3

有关EIP doTrydoCatchdoFinally的更多详细信息。
有关选项stopOnException的更多详细信息。

相关问题