Apache Camel-定义中没有子级管道

问题描述 投票:0回答:1

这是我的简单路线:

@Override
public void configure() {

onException(Exception.class)
    .handled(true)
    .process(exchange -> {
      Exception exception = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class);
      log.error(logFormat.error(exchange, exception, exception.getMessage()));
      exchange.getIn().setBody(exception.getMessage());
      exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, HttpStatus.SC_INTERNAL_SERVER_ERROR);
    });

onException(HttpOperationFailedException.class)
    .handled(true)
    .to("direct:handleHttpOperationFailed");

from("direct:myRoute")
    .routeId("myRoute")
    .log("Route start: myRoute")
    .id("startStep")
    .process(
        exchange -> log.info("Doing some processing")
    )
    .id("processingStep")
    .end();
}

现在我要编写一些测试:

  1. 异常处理情况-在“ processingStep”之后引发异常并在onException中处理
  2. 肯定的情况-所有流程都在无例外的情况下通过

这就是我所做的...

我的测试注释:

@RunWith(CamelSpringBootRunner.class)
@UseAdviceWith
@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class StarlingFpsInboundWebhookIT {
   ...
}

我的两个测试用例:

  1. 有例外情况-在这里我使用adviceWith在“ processingStep”之后抛出例外:
@Test
public void exceptionScenario() throws Exception {

    // Given
    context.getRouteDefinition("myRoute").adviceWith(context, new AdviceWithRouteBuilder() {
      @Override
      public void configure() {
        weaveById("processingStep").after()
            .process(exchange -> {
              throw ExceptionFixtures.createSimpleException();
            })
            .id("exceptionThrowStep");
      }
    });
    context.start();

    String requestBody = ResourcesHelper.read(this.getClass(), "/data/input/request.json");

    // When
    template.send("direct:myRoute", camelExchange -> {...});
}
  1. 成功案例-在这里,我需要删除以前创建的“ exceptionThrowStep”,以免引发异常:
@Test
public void successScenario() throws Exception {

    // Given
    context.getRouteDefinition("myRoute").adviceWith(context, new AdviceWithRouteBuilder() {
      @Override
      public void configure() {
        weaveById("exceptionThrowStep").remove();
      }
    });
    context.start();


    String requestBody = ResourcesHelper.read(this.getClass(), "/data/input/request.json");

    // When
    template.send("direct:myRoute", camelExchange -> {...});
}

并且当我运行那些测试时(第一个异常然后是成功的场景),我在第二个测试中出现了异常:

org.apache.camel.FailedToCreateRouteException: 
Failed to create route myRoute at: 
>>> pipeline -> [[]] <<< 
in route: Route(myRoute)[[From[direct:myRoute]... 
because of Definition has no children on pipeline -> [[]]

为什么会发生此异常?我读过很多文章,但在这种情况下没有发现任何宝贵的东西:(有趣的是-在adviceWith的第二次测试中,我使用replace()而不是remove()时,一切正常...

我的问题是:

  1. 在路由中测试异常处理的好方法吗?
  2. 我们可以重置测试之间的路由定义以避免我的方法吗?

这是我的简单路线:@Override public void configure(){onException(Exception.class).handled(true).process(exchange-> {Exception exception = exchange.getProperty(Exchange ....

java apache-camel
1个回答
0
投票

我首先从您的两个问题开始:

© www.soinside.com 2019 - 2024. All rights reserved.