Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • 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
langjava

/**

...


 * 
 * @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 CxfBcProvider
    Code Block
    langjava
        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
    
        }
    

...