THIS IS A TEST INSTANCE. ALL YOUR CHANGES WILL BE LOST!!!!
...
- JBI compliant Binding Component
- Usable in a lightweight mode in servicemix.xml configuration files
- SOAP 1.1 and 1.2 support
- MIME attachments
- Support for InOut or InOnly MEPs as consumers or providers
- SSL support
- WS-Security support
- WS-Policy support
- WS-RM support
- WS-Addressing support
...
CxfBcProvider
We use maven-xbean-plugin to generate provider xbean schema, so we need add comment to specify the xml element name firstly
first
Code Block | ||
---|---|---|
| ||
/** |
...
* * @org.apache.xbean.XBean element="provider" |
...
*/ |
Provider of binding component means bridge internal request to outside server, for example
cxf proxy inside servicemix ===> cxf bc provider===> standalone cxf server outside servicemix
Similiar as CxfBcConsumer, CxfBcProvider also play two role in the message process
- servicemix provider
- cxf client
The message process looks like
provider get incoming jbi message from NMR==> transform it to soap message==> send out to external service==> in the registered MessageObserver, get response soap message from external service==> transform it to jbi message==> send back to the NMR.
This process splitted into two classes,
The first half in CxfBcProviderCode Block lang java public void process(MessageExchange exchange) throws Exception { NormalizedMessage nm = exchange.getMessage("in");//get incoming jbi message CxfBcProviderMessageObserver obs = new CxfBcProviderMessageObserver(exchange, this); conduit.setMessageObserver(obs);// register message observer for cxf client Message message = ep.getBinding().createMessage();//create outgoing cxf message based on the service model, both soap11 and soap12 is supported message.put(MessageExchange.class, exchange); Exchange cxfExchange = new ExchangeImpl(); message.setExchange(cxfExchange); cxfExchange.setOutMessage(message); ... ... message.setInterceptorChain(outChain); InputStream is = JBIMessageHelper.convertMessageToInputStream(nm.getContent()); StreamSource source = new StreamSource(is); message.setContent(Source.class, source); message.setContent(InputStream.class, is); conduit.prepare(message); OutputStream os = message.getContent(OutputStream.class); XMLStreamWriter writer = message.getContent(XMLStreamWriter.class); String encoding = getEncoding(message); try { writer = StaxOutInterceptor.getXMLOutputFactory(message).createXMLStreamWriter(os, encoding); } catch (XMLStreamException e) { // } message.setContent(XMLStreamWriter.class, writer); message.put(org.apache.cxf.message.Message.REQUESTOR_ROLE, true); outChain.doIntercept(message);//transform jbi message to soap message XMLStreamWriter xtw = message.getContent(XMLStreamWriter.class); if (xtw != null) { xtw.writeEndDocument(); xtw.close(); } os.flush(); is.close(); os.close();//send out message to external service }
...