hello all,

Apache Camel is an interesting, huge tech stack / framework.

Recently, as I'm learning the ropes of Apache Camel, I tried making a web based pdf renderer which I called it 'camel print'.
I got into quite a lot of bummers and finally made a working version.
In a gist, the route is like:

|context.addRoutes(new RouteBuilder() {||
||||
||  @Override||
||  public void configure() throws Exception {||
||from("seda:print.jobs?concurrentConsumers=5&waitForTaskToComplete=IfReplyExpected") ||
||    .choice()||
||    .when(header("outputType").isEqualTo("xml"))||
||      .marshal().jaxb(jaxbctxpath).stop()||
||    .when(header("outputType").isEqualTo("xslt"))||
||      .marshal().jaxb(jaxbctxpath)||
||      .toD("xslt:${header.xsltTemplate}").stop()||
||    .otherwise()||
||      .marshal().jaxb(jaxbctxpath)||
||      .toD("xslt:${header.xsltTemplate}")||
||      .process("foToPdfProcessor").stop();||
||  }||
||});
|

I tried doing this in xml using xml-io-dsl
https://camel.apache.org/components/4.18.x/others/java-xml-io-dsl.html
It actually worked very well, until I got stuck as I wanted to 'dynamically' pass that '|jaxbctxpath'| for the jaxb context path. I couldn't figure out how to pass 'variables' during route build phase with xml, and finally resorted to just doing java dsl.

'printing' or rendering is like

|  ProducerTemplate template = camelmgr.getProducerTemplate(); ||
||  Exchange pdfResp = template.request("seda:print.jobs", exchange -> {||
||    exchange.getIn().setBody(jaxbObject);||
||    exchange.getIn().setHeader("xsltTemplate", xsltemplate);||||||
||  });||
||||
||  byte[] pdf = pdfResp.getMessage().getBody(byte[].class);||
|

The stack is kind of 'huge' it apparently pulled in a good number of camel dependencies, I'm not sure if I'd be able to make that 'thinner'. The other 'non-camel' dependencies are like Apache FOP, jetty etc.

Hope to hear your comments

Cheers :)
  Andrew

||


Reply via email to