当前位置: 首页 > 知识库问答 >
问题:

分割EIP中的骆驼异常路由

华泽语
2023-03-14

我正在将CSV文件输入集成到一个更大的系统中,我想对其进行设置,以便将CSV中未正确解析的各行(由split)发送到医院队列,并将所有其他工作行转换为一个对象并聚合到一个列表中。但是,我很难将拆分中抛出的异常消息路由到其他位置,而不会出现在拆分结束时的聚合器中。为了简化它,我编写了一个单元测试,在分割中抛出一个异常,并尝试让它工作。我将字符串1\n2\n3\n拆分为三条消息,在其中一条消息上引发异常,并将其余字符串连接到末尾。

public void configure() throws Exception {

    onException(Exception.class)
        .handled(true)
        .to("log:dead?level=ERROR");

    from("direct:test")
        .split(body().tokenize("\n"), new MyAggregationStrategy())
            .process(new ThrowMyException())
        .end()
        .to("mock:out");
}

@Test
public void test() throws InterruptedException {

    MockEndpoint out = getMockEndpoint("mock:out");
    out.expectedMessageCount(1);

    template.sendBody("direct:test", "1\n2\n3\n");

    assertMockEndpointsSatisfied();
}

ThrowMyException控制器:只是抛出一个异常

@Override
public void process(Exchange exchange) throws Exception {
    System.out.println("[" + exchange.getIn().getBody() + "]");
    if (exchange.getIn().getBody(String.class).trim().contentEquals("2")) {
        System.out.println("Throwing exception");
        throw new Exception();
    }
}

MyAggregationStrategy:只是连接字符串

@Override
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
    if (oldExchange == null) {
        return newExchange;
    }
    oldExchange.getIn().setBody(
            oldExchange.getIn().getBody(String.class) + 
            newExchange.getIn().getBody(String.class));
    System.out.println(oldExchange.getIn().getBody());
    return oldExchange;
}

我所期望的是,onException处理程序,正如我所指出的,它将处理异常(handled(true)),它将在收到消息“2”时使用控制器抛出的异常,我将得到聚合器打印出的结果13。我确实得到了由onException处理程序打印出来的行:

错误死-交换[ExchangePattern:InOnly,BodyType:String,Body:2]

但聚合器随后返回“123”而不是“13”。

我也尝试过使用死信频道

errorHandler(deadLetterChannel("log:dead?level=ERROR")

我还尝试在onException处理程序中指定continued(false),但没有成功。

我意识到我可以通过查看exchange在聚合器中查找异常。getProperty(Exchange.EXCEPTION_capture),然后不聚合它。所以我有一个解决办法。但是,如果有一种方法可以在我的路线中使用onExceptionerrorHandler,我更愿意这样做。


共有1个答案

别烨熠
2023-03-14

骆驼文档为停止OnExc0019分配器选项说

是否在发生异常时立即停止或继续处理。如果禁用,则继续分割并处理子消息,而不管其中一个消息是否失败。您可以在AggregationStrategy类中处理异常,您可以完全控制如何处理异常。

这以及Camel的作用表明,两个拆分器异常处理选项是在聚合器中处理异常,或者使用stopOnException(),这将阻止整个拆分器迭代器继续运行。

您可以使用exchange.get异常()方法,或exchange.is失败()来测试聚合器中的异常和错误。如果您使用了处理(true)上的onExc0019方法,则必须使用exchange.get属性(Exchange.EXCEPTION_CAUGHT)

 类似资料:
  • Camel Version 2.22.0 运行时:SpringBoot:2.0.2.RELEASE JDK版本:1.8。0_121 弹性公网IP:收件人列表。 问题:从接收方列表的并行进程引发的异常未在路由级别的onExc的子句中捕获。 下面是DSL

  • 我们在Camel中定义了一个路由,并且必须找出是否在处理器中抛出了异常。当我们只有一个处理器时,Camel会在sendbody()方法中重新抛出异常。如果有前面的拆分/聚合,则不会抛出异常。因此下面示例的结果是 如果我省略所有从。拆分到。完成大小(1)输出是 任何想法如何找出,如果一个异常发生后分裂? 为了在之后检查异常,我们找到了一个解决方案。我们向onException()注册了一个Error

  • 我正在尝试从目录中选取一个文件,拆分一个文件,并将每一个拆分行添加到ActiveMQ中。我在这个过程中遇到了异常处理的问题。假设目录中的文件是一个二进制文件(可执行文件),那么splitter会显示org.apache.camel.runtimeCamelException和java.nio.charset.MalFormedInputException异常。如果出现这种情况,那么我需要捕获这些异

  • 我试图使用Kerberos从ActiveMQ-Camel桥向Kafka (Cloudera)发送消息。 ActiveMQ v5.15.4 骆驼:2.21.1 Kafka客户端:1.1.0 服务器版本:Apache/2.4.6(CentOS) 骆驼.xml剪刀是: 这是日志中的kafka客户端配置: 日志级别:调试 Jaas文件: 出口: 当我发送消息时,我在调试级别收到以下日志,但消息未被发送:

  • 在camel spring ws中,有没有办法将自定义主体(例如自定义bean)和http状态返回为500? 我试过了 然后在processor公共类ExceptionProcessor实现processor{ } 但是即使身体是我想要的,超文本传输协议状态总是200。 你能帮我吗? 更多信息:我正在使用camel 2.20.2版

  • 无法弄清楚这是怎么回事-试图设置一个路由,只看到cxf连接到soap web服务(我不关心实际数据,也不期望数据实际“工作”,但它不断引发一个我不理解的异常: 我想知道我是否正确配置了它。我想这可能是一个丢失的jar,但当我尝试引入其他jar时,导致了依赖冲突 我正在使用maven依赖项“camel-cxf”来加载我所有的jar配置 “原因:org.apache.cxf.bus.extension