I have to do xml –xml transformation. Since source xml is expected to be very
big around 300mb, so I am splitting the sub-elements and processing
concurrently. As I am doing partial marshal and unmarshal, I am writing
root’s starting tag and ending tag separately. During addition of the
closing tag, I am facing an issue. Root end tag is not getting added at the
bottom but somewhere before end. Hence making the xml invalid. When I am
writing the end element some sub-elements were still being processed and
they appear after end element is already written. Is there any way, I can
wait until all threads in threadPool has finished with their work?
My route looks like this.
JAXBContext jaxbContextH =
JAXBContext.newInstance(HierarchicalLineType.class);
JaxbDataFormat jaxb = new JaxbDataFormat(jaxbContextH);
HierarchicalLineType c = new HierarchicalLineType();
jaxb.setPartClass(c.getClass().getCanonicalName());
jaxb.setFragment(true);
JAXBContext jaxbContextFlat =
JAXBContext.newInstance(FlatLineType.class);
JaxbDataFormat jaxbFlat = new JaxbDataFormat(jaxbContextFlat);
FlatLineType flatLine = new FlatLineType();
jaxbFlat.setPartClass(flatLine.getClass().getCanonicalName());
jaxbFlat.setFragment(true);
from("file:target/outbox?noop=true&fileName=source.xml")
.log("Starting to process Xml file:
${header.CamelFileName}")
.multicast().to(
"direct:fileInitiator","direct:xmlTransformation")
.end()
.log("Done processing big file:
${header.CamelFileName}");
from("direct:fileInitiator").routeId("fileInitiator").bean(MyService,
"writeBeginningElement")
.to("file:target/outbox?fileName=target.xml&fileExist=Override");
from("direct:xmlTransformation")
.routeId("businessConversion")
.split(stax(HierarchicalLineType.class))
.streaming().executorService(threadPool)
.bean(MyService.class, "transformFromHierarchyXMLToFlatXML")
.marshal(jaxbFlat)
.bean(MyService.class, "writeClosingTags")
.aggregate(header(Exchange.FILE_NAME_ONLY),
new StringBodyAggregator()).completionSize(750)
.completionPredicate(header("CamelSplitComplete").isEqualTo(Boolean.TRUE)).completionTimeout(1500)
.to("file:target/outbox?fileName=target.xml&fileExist=Append");
public void fileFlatClosingTags(String body, Exchange exchange) {
boolean isComplete= (Boolean)
exchange.getProperty("CamelSplitComplete");
String modBody=body;
if(isComplete){
modBody=body+"</FlatLines>";
}
exchange.getIn().setBody(modBody);
}
public String writeFlatBeginningElement(Exchange exchange){
return "<FlatLines>";
}
Thank in advance
--
View this message in context:
http://camel.465427.n5.nabble.com/How-to-make-aggregator-wait-until-all-threads-are-completed-tp5785167.html
Sent from the Camel - Users mailing list archive at Nabble.com.