I got to go to QCon in London this year, and decided to put together something challenging for my presentation. I'd been playing with Unified Business Language (UBL 2.0), and posed the question: how easy would it be to build a Celtix Enterpise server that can accept a UBL invoice in a variety of formats (XML, SOAP, JSON) over a number of transports (AMQP, JMS and HTTP)?
Finding the answer turned out to be a lot of fun: Using Eclipse, WTP and Celtix Enterprise I quickly got a WSDL contract together for the service, along with bindings for XML and SOAP payloads. After that, implementation was straightforward JAX-WS - all the details are provided in my slideware, which I'm attaching to this blog. Using JSON was a little tricky, but thanks to some help from Dan Diephouse (Thanks Dan!) I used the Jettison STAX implementation with an XML binding to produce both Badgerfish and mapped JSON. It's a pragmatic approach, but I'd prefer it if there was a bona-fide JSON binding for WSDL that handles these detail, taking JSON support out of the code and into the contract. Maybe that's something we should get into the Apache CXF roadmap?
While it's always great to put a lovely demo together and have it work on the day, its doubly rewarding to see how relevant this stuff is: AMQP is a hot topic right now and the ability to simply configure AMQP in to a pure-Java JAX-WS client or service is really nice. Also, as Sailesh Panchal of Travelex was keen to point out in his presentation, the ability to support XML and SOAP payloads over multiple transports is hugely important in terms of producing really reusable services, supporting both REST and SOA architectures.
Next up? I'd like to push my demo a little further to get some performance stats over different payload and protocol combinations: I've heard talk that JSON parsing can be up to 100x faster than XML parsing: let's see if that really holds true. Also, I'm keen to test the fundamental premise of AMQP: on-the-wire interoperability between different messaging middlewares. Right now my client, service and broker are all Apache QPID, the AMQP implementation that comes bundled in Celtix enterprise. I'd like to see what happens if when I swap the qpid broker with open-amqp or RabbitMQ... watch this space for more...