0

我有以下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]
....

我已经阅读了一些解决方案,大多数答案都围绕未能启动骆驼上下文,或者使用第二个上下文而不是修改路线的上下文等,但我认为情况并非如此这里; 调试仅显示 1 个肯定启动的上下文,其中仅包含 MyRouteBuilder 的路由定义(与路由 + 异常处理路由相反)。

4

0 回答 0