Apache camel 使用camel合并xml输出时出现问题
从各种源创建XML输出,这些源需要为XSLT处理器进行组合,但在使用PollRich时“端点上没有可用的使用者”。pollEnrich聚合器无法将其传递给pollEnrich Exchange 取出聚合器并使用默认聚合器。得到同样的问题。添加日志表明有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
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不使用并行处理,它也会返回“端点上没有可用的消费者”。