Apache camel 使用camel合并xml输出时出现问题

Apache camel 使用camel合并xml输出时出现问题,apache-camel,Apache Camel,从各种源创建XML输出,这些源需要为XSLT处理器进行组合,但在使用PollRich时“端点上没有可用的使用者”。pollEnrich聚合器无法将其传递给pollEnrich Exchange 取出聚合器并使用默认聚合器。得到同样的问题。添加日志表明有XML输出来自到端点的先前路径 package com.hitrust.route; import com.hitrust.aggregator.AddToOutput; import com.hitrust.processor.ConvertR

从各种源创建XML输出,这些源需要为XSLT处理器进行组合,但在使用PollRich时“端点上没有可用的使用者”。pollEnrich聚合器无法将其传递给pollEnrich Exchange

取出聚合器并使用默认聚合器。得到同样的问题。添加日志表明有XML输出来自到端点的先前路径

package com.hitrust.route;

import com.hitrust.aggregator.AddToOutput;
import com.hitrust.processor.ConvertResultToRecords;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.processor.aggregate.AggregationStrategy;

public class AuthoritativeSourceDocument extends RouteBuilder {

   public void configure() throws Exception {

    AggregationStrategy addToOutput = new AddToOutput();

    restConfiguration()
           .component("restlet")
           .host("localhost").port("18082");

    rest("/authoritativesourcedocument/{authoritativesourcedocumentid}")
            .consumes("application/json").produces("application/json")
            .get()
            .to("direct:Start");

    from("direct:Start")
            .multicast()
            .to("direct:GetSections")
            .to("direct:GetTransactions")
            .to("direct:MergeSections");

    from("direct:GetSections")
            .setBody(simple("SELECT * " +
                    "  FROM [dbo].[Section] AS S" +
                    "  WHERE [Id] = ${header.id}"))
            .to("jdbc:dataSource")
            .setProperty("paramName", simple("Sections"))
            .process(new ConvertResultToRecords())
            .to("direct:GetSectionsOutput");

    from("direct:GetTransactions")
            .setBody(simple("SELECT * " +
                    "  FROM [dbo].[SectionTransaction] AS ST" +
                    "  WHERE [Id] = ${header.id}"))
            .to("jdbc:dataSource")
            .setProperty("paramName", simple("SectionTransactions"))
            .process(new ConvertResultToRecords())
            .to("direct:GetTransactionsOutput");

    from("direct:MergeSections")
            .setBody(simple("<param><id>${header.id}</id></param>"))
            .convertBodyTo(org.w3c.dom.Document.class)
            .pollEnrich("direct:GetSectionsOutput", 500, addToOutput)
            .pollEnrich("direct:GetTransactionsOutput", 500, addToOutput)
            .to("xslt:file:src/main/resources/xslts/MergeSections.xsl")


  }
}
package com.hitrust.route;
导入com.hitrust.aggregator.AddToOutput;
导入com.hitrust.processor.ConvertResultToRecords;
导入org.apache.camel.builder.RouteBuilder;
导入org.apache.camel.processor.aggregate.AggregationStrategy;
公共类AuthoritiveSourceDocument扩展了RouteBuilder{
public void configure()引发异常{
AggregationStrategy addToOutput=新的addToOutput();
restConfiguration()
.组件(“restlet”)
.host(“localhost”).port(“18082”);
rest(“/authoritivesourcedocument/{authoritivesourcedocumentid}”)
.consumes(“应用程序/json”).products(“应用程序/json”)
.get()
。至(“直接:启动”);
从(“直接:开始”)
.multicast()
.至(“直接:获取部分”)
.to(“直接:GetTransactions”)
。致(“指示:合并各节”);
来自(“直接:获取部分”)
.setBody(简单(“选择*”+
“从[dbo].[Section]作为S”+
“其中[Id]=${header.Id}”))
.to(“jdbc:数据源”)
.setProperty(“参数名”,简单(“节”))
.process(新ConvertResultToRecords())
。至(“直接:GetSectionsOutput”);
from(“直接:GetTransactions”)
.setBody(简单(“选择*”+
“从[dbo].[SectionTransaction]作为ST”+
“其中[Id]=${header.Id}”))
.to(“jdbc:数据源”)
.setProperty(“paramName”,简单(“SectionTransactions”))
.process(新ConvertResultToRecords())
.to(“direct:GetTransactionsOutput”);
来自(“直接:合并部分”)
.setBody(简单(“${header.id}”))
.convertBodyTo(org.w3c.dom.Document.class)
.pollRich(“直接:GetSectionsOutput”,500,addToOutput)
.pollRich(“直接:GetTransactionsOutput”,500,addToOutput)
.to(“xslt:file:src/main/resources/xslts/MergeSections.xsl”)
}
}
要执行并合并上一个路由的xml输出,请尝试使用“seda:”而不是“direct:”,从您的Get*路由发送消息到MergeSections路由:

[...]
from("direct:Start")
        .multicast()
        .to("direct:GetSections")
        .to("direct:GetTransactions")
        .to("direct:MergeSections");

from("direct:GetSections")
        .setBody(simple("SELECT * " +
                "  FROM [dbo].[Section] AS S" +
                "  WHERE [Id] = ${header.id}"))
        .to("jdbc:dataSource")
        .setProperty("paramName", simple("Sections"))
        .process(new ConvertResultToRecords())
        .to("seda:GetSectionsOutput");

from("direct:GetTransactions")
        .setBody(simple("SELECT * " +
                "  FROM [dbo].[SectionTransaction] AS ST" +
                "  WHERE [Id] = ${header.id}"))
        .to("jdbc:dataSource")
        .setProperty("paramName", simple("SectionTransactions"))
        .process(new ConvertResultToRecords())
        .to("seda:GetTransactionsOutput");

from("direct:MergeSections")
        .setBody(simple("<param><id>${header.id}</id></param>"))
        .convertBodyTo(org.w3c.dom.Document.class)
        .pollEnrich("seda:GetSectionsOutput", 500, addToOutput)
        .pollEnrich("seda:GetTransactionsOutput", 500, addToOutput)
        .to("xslt:file:src/main/resources/xslts/MergeSections.xsl")
[…]
从(“直接:开始”)
.multicast()
.至(“直接:获取部分”)
.to(“直接:GetTransactions”)
。致(“指示:合并各节”);
来自(“直接:获取部分”)
.setBody(简单(“选择*”+
“从[dbo].[Section]作为S”+
“其中[Id]=${header.Id}”))
.to(“jdbc:数据源”)
.setProperty(“参数名”,简单(“节”))
.process(新ConvertResultToRecords())
.to(“seda:GetSectionsOutput”);
from(“直接:GetTransactions”)
.setBody(简单(“选择*”+
“从[dbo].[SectionTransaction]作为ST”+
“其中[Id]=${header.Id}”))
.to(“jdbc:数据源”)
.setProperty(“paramName”,简单(“SectionTransactions”))
.process(新ConvertResultToRecords())
.to(“seda:GetTransactionsOutput”);
来自(“直接:合并部分”)
.setBody(简单(“${header.id}”))
.convertBodyTo(org.w3c.dom.Document.class)
.pollRich(“seda:GetSectionsOutput”,500,addToOutput)
.pollRich(“seda:GetTransactionsOutput”,500,addToOutput)
.to(“xslt:file:src/main/resources/xslts/MergeSections.xsl”)

您的代码看起来还假设默认情况下多播是并行地调度到端点的,但事实并非如此。您需要为此添加parallelProcessing()选项。

尝试了此操作。添加并行处理时,addToOutput的资源交换将为null。即使seda不使用并行处理,它也会返回“端点上没有可用的消费者”。