Camel:当调用2个recipientList步骤时,Exchange失败

时间:2017-02-16 14:25:27

标签: java xslt apache-camel

我正试图通过recipientList在我的路线中调用2个xsl变换。我有一个包裹在选择步骤中,另一个正常添加:

DateTimeFormatInfo format = new DateTimeFormatInfoImpl_es_MX();
format.dateFormatLong(); // d 'de' MMMM 'de' y

`

当与要转换的标头的交换命中第一个receiveList调用(Common.xsl)时,xml被转换并且它正常工作。当它遇到第二个呼叫时,我在控制台中得到以下内容:

    from("direct:cosTransform")
    .routeId(TransformerConstants.TRANSFORM_XSLT_ROUTE)
    .process(exchange -> {

        // Get the xml payload from the exchange body
        final String xml = exchange.getIn().getBody(String.class);

        // Determine LOB and set as header.  If the LOB is invalid, the xslt step will fail.
        final String lob = TransformerUtil.getLOBFromAcordXml(xml);
        if (null == lob) {
            throw new GeneralException("Could not derive the LOB from the ACORD Form.  ACORD Form["
                    + TransformerUtil.getAcordFormFromAcordXml(xml) + "]");
        }
        exchange.getIn().setHeader("lineOfBusiness", lob);

        // Market should be NI or BI.  If the market is invalid, the xslt step will fail.
        final String market = TransformerUtil.getMarketFromAccordXml(xml);
        if (!StringUtils.equals(market, TransformerConstants.BI_MARKET)
                && !StringUtils.equals(market, TransformerConstants.NI_MARKET)) {
            throw new GeneralException("Missing or invalid market[" + market + "].");
        }
        exchange.getIn().setHeader("market", market);
    })
    .log("Executing an xsl transform for Market=${header.market} and LOB=${header.lineOfBusiness}")
    .choice()
    .when(header("market").isEqualTo("NI"))
        .recipientList(simple("xslt:./xsl/${header.market}/Common.xsl?saxon=true&contentCache=false")).id("commonTransformNI")
        .log("after common :${body}")
    .endChoice()
    .recipientList(simple("xslt:./xsl/${header.market}/${header.lineOfBusiness}.xsl?saxon=true&contentCache=false"))
    .log("after lob : ${body}")
    .choice().id("postTransform")
        .when(header("market").isEqualTo("NI"))
            .process(exchange  -> {
                String xml = exchange.getIn().getBody(String.class);

                xml = TransformerUtil.setUniqueIds(xml);
                exchange.getIn().setBody(xml);
            })
        .endChoice()
    .end();
}

我已经尝试了一些测试,在第二次调用之后添加了一个模拟端点并检查了一条消息,使用日志消息来跟踪交换路由到达路径的距离,它似乎永远不会到达第二个调用时,它总是在前往第二个xslt步骤时抛出异常。即使我发送的交易所与when条件不匹配,也不会达到第二个xslt步骤。 xsl字符串中的路径是正确的,当我删除选择逻辑和第二个xslt步骤时,xsl运行正常,无论字符串是用于common.xsl文件还是业务线xsl文件

注意:由于xsl中的某些模板,我必须将转换拆分为它们自己的步骤,即我无法导入其中一个文件,因此转换必须单独调用

编辑:我已经实现了一个处理器来手动运行xslt。我仍然想深究这一点,即使使用.to调用和硬编码参数,我仍然会遇到同样的问题。是骆驼中的XSLT组件吗?

0 个答案:

没有答案