Верблюд: исключение DirectConsumerNotAvailable во время теста

У меня есть следующий RouteBuilder:

MyRouteBuilder.java

@Component
public class MyRouteBuilder extends SpringRouteBuilder {

@Autowired
private MQConnectionProperties mqConnectionProperties;

@Override
public void configure() {
    setupExceptionHandler();
    setupTransformerReceiveChannel();
    setupOrchestrationChannel();
}

private void setupExceptionHandler() {
    onException(Exception.class).handled(true).to("direct:error");
}

private void setupTransformerReceiveChannel() {
    from(mqConnectionProperties.getTransformerReceiveQueue())
    .routeId(TransformerConstants.TRANSFORM_CONSUME_ROUTE)
    .log("Processing transform request.")
    .setHeader(TransformerConstants.TRANSFORM_HEADER_STATUS, simple("SUCCESS"))
    .to("direct:cosTransform")
    .end();
}

private void setupOrchestrationChannel() {
    from("direct:cosTransform")
    .routeId(TransformerConstants.TRANSFORM_XSLT_ROUTE)
    .process(new XSLTConfigurationProcessor())
    .log("Executing an xsl transform for Market=${header.market} and LOB=${header.lineOfBusiness}")
    .choice().id("transformBranch")
    .when(header("market").isEqualTo("NI"))
        .process(new TransformerNIProcessor()).id("NITransform")
    .endChoice()
    .otherwise()
        .recipientList(simple("xslt:./xsl/${header.market}/${header.lineOfBusiness}.xsl?saxon=true&contentCache=false")).id("BITransform")
    .end();
}

}

Примечание. Обработчик исключений определяется как отдельный класс routeBuilder. У меня есть следующий модульный тест для MyRouteBuilder.

MyRouteBuilderTest.java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MyRouteTestConfiguration.class)
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public class TransformerRouteBuilderUnitTest extends CamelTestSupport{

@Autowired
MQConnectionProperties mqConnectionProperties;

@Autowired
MyRouteBuilder myRouteBuilder;

MockEndpoint mockOutput;
MockEndpoint mockError;
MockEndpoint mockProcessor;


@Override
public boolean isUseAdviceWith() {
    return true;
}

@Override
protected RoutesBuilder createRouteBuilder() {
    return myRouteBuilder;
}
@Before
public void setup() throws Exception {
    super.setUp();
}

@Override
public String isMockEndpoints() {
    return "direct:cosTransform";
}


@Test
public void test_transformerReceiveChannel_happyPath_transformStatusHeaderSet() throws Exception {
    startCamelContext();

    mockOutput = getMockEndpoint("mock:direct:cosTransform", false);

    mockOutput.expectedHeaderReceived("TransformStatus", "fail");

    template.requestBody(mqConnectionProperties.getTransformerReceiveQueue(), new DefaultExchange(context));

    MockEndpoint.assertIsSatisfied(context);

    stopCamelContext();
}

трассировки стека

org.apache.camel.CamelExecutionException: Exception occurred during execution on the exchange: Exchange[ID-LIBP03P-QK70A9V-57085-1490361963523-1-2]
at org.apache.camel.util.ObjectHelper.wrapCamelExecutionException(ObjectHelper.java:1706)
at org.apache.camel.util.ExchangeHelper.extractResultBody(ExchangeHelper.java:660)
at org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:471)
at org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:133)
at org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:149)
at org.apache.camel.impl.DefaultProducerTemplate.requestBody(DefaultProducerTemplate.java:301)
at com.transformer.routing.MyRouteBuilderUnitTest.test_transformerReceiveChannel_happyPath_transformStatusHeaderSet(TransformerRouteBuilderUnitTest.java:89)
.....
Caused by: org.apache.camel.component.direct.DirectConsumerNotAvailableException: No consumers available on endpoint: Endpoint[direct://error]. Exchange[ID-LIBP03P-QK70A9V-57085-1490361963523-1-4]
....

Я прочитал несколько решений для этого, и большинство ответов вращаются вокруг неспособности начать контекст верблюда или использования второго контекста, а не контекста с измененным маршрутом и т. Д., Но я не думаю, что это так Вот; отладка показывает только один контекст, который определенно запускается, который содержит только определение маршрута для MyRouteBuilder (в отличие от маршрута + маршрут обработки исключений).

java,spring-boot,apache-camel,camel-test,

0

Ответов: 0

Верблюд: исключение DirectConsumerNotAvailable во время теста

У меня есть следующий RouteBuilder:

MyRouteBuilder.java

@Component
public class MyRouteBuilder extends SpringRouteBuilder {

@Autowired
private MQConnectionProperties mqConnectionProperties;

@Override
public void configure() {
    setupExceptionHandler();
    setupTransformerReceiveChannel();
    setupOrchestrationChannel();
}

private void setupExceptionHandler() {
    onException(Exception.class).handled(true).to("direct:error");
}

private void setupTransformerReceiveChannel() {
    from(mqConnectionProperties.getTransformerReceiveQueue())
    .routeId(TransformerConstants.TRANSFORM_CONSUME_ROUTE)
    .log("Processing transform request.")
    .setHeader(TransformerConstants.TRANSFORM_HEADER_STATUS, simple("SUCCESS"))
    .to("direct:cosTransform")
    .end();
}

private void setupOrchestrationChannel() {
    from("direct:cosTransform")
    .routeId(TransformerConstants.TRANSFORM_XSLT_ROUTE)
    .process(new XSLTConfigurationProcessor())
    .log("Executing an xsl transform for Market=${header.market} and LOB=${header.lineOfBusiness}")
    .choice().id("transformBranch")
    .when(header("market").isEqualTo("NI"))
        .process(new TransformerNIProcessor()).id("NITransform")
    .endChoice()
    .otherwise()
        .recipientList(simple("xslt:./xsl/${header.market}/${header.lineOfBusiness}.xsl?saxon=true&contentCache=false")).id("BITransform")
    .end();
}

}

Примечание. Обработчик исключений определяется как отдельный класс routeBuilder. У меня есть следующий модульный тест для MyRouteBuilder.

MyRouteBuilderTest.java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MyRouteTestConfiguration.class)
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public class TransformerRouteBuilderUnitTest extends CamelTestSupport{

@Autowired
MQConnectionProperties mqConnectionProperties;

@Autowired
MyRouteBuilder myRouteBuilder;

MockEndpoint mockOutput;
MockEndpoint mockError;
MockEndpoint mockProcessor;


@Override
public boolean isUseAdviceWith() {
    return true;
}

@Override
protected RoutesBuilder createRouteBuilder() {
    return myRouteBuilder;
}
@Before
public void setup() throws Exception {
    super.setUp();
}

@Override
public String isMockEndpoints() {
    return "direct:cosTransform";
}


@Test
public void test_transformerReceiveChannel_happyPath_transformStatusHeaderSet() throws Exception {
    startCamelContext();

    mockOutput = getMockEndpoint("mock:direct:cosTransform", false);

    mockOutput.expectedHeaderReceived("TransformStatus", "fail");

    template.requestBody(mqConnectionProperties.getTransformerReceiveQueue(), new DefaultExchange(context));

    MockEndpoint.assertIsSatisfied(context);

    stopCamelContext();
}

трассировки стека

org.apache.camel.CamelExecutionException: Exception occurred during execution on the exchange: Exchange[ID-LIBP03P-QK70A9V-57085-1490361963523-1-2]
at org.apache.camel.util.ObjectHelper.wrapCamelExecutionException(ObjectHelper.java:1706)
at org.apache.camel.util.ExchangeHelper.extractResultBody(ExchangeHelper.java:660)
at org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:471)
at org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:133)
at org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:149)
at org.apache.camel.impl.DefaultProducerTemplate.requestBody(DefaultProducerTemplate.java:301)
at com.transformer.routing.MyRouteBuilderUnitTest.test_transformerReceiveChannel_happyPath_transformStatusHeaderSet(TransformerRouteBuilderUnitTest.java:89)
.....
Caused by: org.apache.camel.component.direct.DirectConsumerNotAvailableException: No consumers available on endpoint: Endpoint[direct://error]. Exchange[ID-LIBP03P-QK70A9V-57085-1490361963523-1-4]
....

Я прочитал несколько решений для этого, и большинство ответов вращаются вокруг неспособности начать контекст верблюда или использования второго контекста, а не контекста с измененным маршрутом и т. Д., Но я не думаю, что это так Вот; отладка показывает только один контекст, который определенно запускается, который содержит только определение маршрута для MyRouteBuilder (в отличие от маршрута + маршрут обработки исключений).

00Java, весна-загрузка, апач-верблюд, верблюд-тест,
Похожие вопросы