需要在处理时结束 Apache 骆驼拆分

Need to end Apache camel split while processing

我的目的是一条一条地发送消息列表(消息是使用数据库中的值生成的)。 我所做的是查询并获取消息列表,将其附加到交换器并使用 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

如何实现这个或者 如果我发送批量消息的过程不正确,请就此提出建议。

实现您尝试在 Camel 路由中实现的目标的一种方法是使用 EIP doTrydoCatchdoFinally,这与著名的 try-catch-finally 非常相似Java 中的块与 stopOnException 关联,以在出现错误时中断拆分的执行。

在下面的示例中,我模拟了我的文件内容的每行验证失败,然后当异常在我的 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

More details about the EIPs doTry, doCatch and doFinally.

More details about the option stopOnException.