<!DOCTYPE html>
<!--
 | Generated by Apache Maven Doxia Site Renderer 1.9.2 at 2021-08-01 
 | Rendered using Apache Maven Fluido Skin 1.6
-->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta name="Date-Revision-yyyymmdd" content="20210801" />
    <meta http-equiv="Content-Language" content="en" />
    <title>Apache Axis2 &#x2013; </title>
    <link rel="stylesheet" href="../css/apache-maven-fluido-1.6.min.css" />
    <link rel="stylesheet" href="../css/site.css" />
    <link rel="stylesheet" href="../css/print.css" media="print" />
      <script type="text/javascript" src="../js/apache-maven-fluido-1.6.min.js"></script>
<meta http-equiv="content-type" content="" />      </head>
    <body class="topBarDisabled">
      <div class="container-fluid">
      <div id="banner">
        <div class="pull-left"><a href="http://www.apache.org/" id="bannerLeft"><img src="http://www.apache.org/images/asf_logo_wide.png"  alt="Apache Axis2"/></a></div>
        <div class="pull-right"><a href=".././" id="bannerRight"><img src="../images/axis.jpg" /></a></div>
        <div class="clear"><hr/></div>
      </div>

      <div id="breadcrumbs">
        <ul class="breadcrumb">
        <li id="publishDate">Last Published: 2021-08-01<span class="divider">|</span>
</li>
          <li id="projectVersion">Version: 1.8.0<span class="divider">|</span></li>
        <li class=""><a href="http://www.apache.org" class="externalLink" title="Apache">Apache</a><span class="divider">/</span></li>
      <li class=""><a href="../index.html" title="Axis2/Java">Axis2/Java</a><span class="divider">/</span></li>
    <li class="active "></li>
        </ul>
      </div>
      <div class="row-fluid">
        <div id="leftColumn" class="span2">
          <div class="well sidebar-nav">
<ul class="nav nav-list">
          <li class="nav-header">Axis2/Java</li>
    <li><a href="../index.html" title="Home"><span class="none"></span>Home</a>  </li>
    <li><a href="../download.html" title="Downloads"><span class="none"></span>Downloads</a>  </li>
    <li><a href="javascript:void(0)" title="Release Notes"><span class="icon-chevron-down"></span>Release Notes</a>
      <ul class="nav nav-list">
    <li><a href="../release-notes/1.6.1.html" title="1.6.1"><span class="none"></span>1.6.1</a>  </li>
    <li><a href="../release-notes/1.6.2.html" title="1.6.2"><span class="none"></span>1.6.2</a>  </li>
    <li><a href="../release-notes/1.6.3.html" title="1.6.3"><span class="none"></span>1.6.3</a>  </li>
    <li><a href="../release-notes/1.6.4.html" title="1.6.4"><span class="none"></span>1.6.4</a>  </li>
    <li><a href="../release-notes/1.7.0.html" title="1.7.0"><span class="none"></span>1.7.0</a>  </li>
    <li><a href="../release-notes/1.8.0.html" title="1.8.0"><span class="none"></span>1.8.0</a>  </li>
      </ul>
  </li>
    <li><a href="../modules/index.html" title="Modules"><span class="none"></span>Modules</a>  </li>
    <li><a href="../tools/index.html" title="Tools"><span class="none"></span>Tools</a>  </li>
          <li class="nav-header">Documentation</li>
    <li><a href="../docs/toc.html" title="Table of Contents"><span class="none"></span>Table of Contents</a>  </li>
    <li><a href="../docs/installationguide.html" title="Installation Guide"><span class="none"></span>Installation Guide</a>  </li>
    <li><a href="../docs/quickstartguide.html" title="QuickStart Guide"><span class="none"></span>QuickStart Guide</a>  </li>
    <li><a href="../docs/userguide.html" title="User Guide"><span class="none"></span>User Guide</a>  </li>
    <li><a href="../docs/jaxws-guide.html" title="JAXWS Guide"><span class="none"></span>JAXWS Guide</a>  </li>
    <li><a href="../docs/pojoguide.html" title="POJO Guide"><span class="none"></span>POJO Guide</a>  </li>
    <li><a href="../docs/spring.html" title="Spring Guide"><span class="none"></span>Spring Guide</a>  </li>
    <li><a href="../docs/webadminguide.html" title="Web Administrator's Guide"><span class="none"></span>Web Administrator's Guide</a>  </li>
    <li><a href="../docs/migration.html" title="Migration Guide (from Axis1)"><span class="none"></span>Migration Guide (from Axis1)</a>  </li>
          <li class="nav-header">Resources</li>
    <li><a href="../faq.html" title="FAQ"><span class="none"></span>FAQ</a>  </li>
    <li><a href="../articles.html" title="Articles"><span class="none"></span>Articles</a>  </li>
    <li><a href="http://wiki.apache.org/ws/FrontPage/Axis2/" class="externalLink" title="Wiki"><span class="none"></span>Wiki</a>  </li>
    <li><a href="../refLib.html" title="Reference Library"><span class="none"></span>Reference Library</a>  </li>
    <li><a href="../apidocs/index.html" title="Online Java Docs"><span class="none"></span>Online Java Docs</a>  </li>
          <li class="nav-header">Get Involved</li>
    <li><a href="../overview.html" title="Overview"><span class="none"></span>Overview</a>  </li>
    <li><a href="../git.html" title="Checkout the Source"><span class="none"></span>Checkout the Source</a>  </li>
    <li><a href="../mail-lists.html" title="Mailing Lists"><span class="none"></span>Mailing Lists</a>  </li>
    <li><a href="../release-process.html" title="Release Process"><span class="none"></span>Release Process</a>  </li>
    <li><a href="../guidelines.html" title="Developer Guidelines"><span class="none"></span>Developer Guidelines</a>  </li>
    <li><a href="../siteHowTo.html" title="Build the Site"><span class="none"></span>Build the Site</a>  </li>
          <li class="nav-header">Project Information</li>
    <li><a href="../team-list.html" title="Project Team"><span class="none"></span>Project Team</a>  </li>
    <li><a href="../issue-tracking.html" title="Issue Tracking"><span class="none"></span>Issue Tracking</a>  </li>
    <li><a href="http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/" class="externalLink" title="Source Code"><span class="none"></span>Source Code</a>  </li>
    <li><a href="../thanks.html" title="Acknowledgements"><span class="none"></span>Acknowledgements</a>  </li>
          <li class="nav-header">Apache</li>
    <li><a href="http://www.apache.org/licenses/LICENSE-2.0.html" class="externalLink" title="License"><span class="none"></span>License</a>  </li>
    <li><a href="http://www.apache.org/foundation/sponsorship.html" class="externalLink" title="Sponsorship"><span class="none"></span>Sponsorship</a>  </li>
    <li><a href="http://www.apache.org/foundation/thanks.html" class="externalLink" title="Thanks"><span class="none"></span>Thanks</a>  </li>
    <li><a href="http://www.apache.org/security/" class="externalLink" title="Security"><span class="none"></span>Security</a>  </li>
  </ul>
          <hr />
          <div id="poweredBy">
              <div class="clear"></div>
              <div class="clear"></div>
              <div class="clear"></div>
              <div class="clear"></div>
  <a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="../images/logos/maven-feather.png" /></a>
              </div>
          </div>
        </div>
        <div id="bodyColumn"  class="span10" >
<html>


<h1>How to Write Your Own Axis2 Transport</h1>

<section>
<h2><a name="Prologue"></a>Prologue</h2>


<p>To stop you from re-inventing the wheel, before we get started, I will
quickly list the transports that are already supported in Axis2 with a small
description.</p>


<p></p>

<ul>
  
<li><b>HTTP</b> - In the HTTP transport, the transport Listener is either a
    Servlet or a Simple HTTP server provided by Axis2. The transport Sender
    uses sockets to connect and send the SOAP message. Currently we have the
    Apache Httpcomponents based HTTP Transport sender as the default
  transport.</li>
  
<li><b>TCP</b> - This is the most simple transport, but needs Addressing
    support to be functional.</li>
</ul>


<p>To understand the rest of this document you will need some understanding
of the architecture of Axis2. If you are not familiar with the Axis2
architecture, please go through the <a href="Axis2ArchitectureGuide.html">Axis2 Architecture Guide</a> before you
read any further.</p>

<section>
<h2><a name="Introduction"></a>Introduction</h2>


<p>Broadly speaking, a transport inside Axis2 can be classified as a way of
getting messages that arrive though some channel into the Axis2 engine. The
core of Axis2 is transport independent. All data that is transport specific
is stripped out of the incoming message and inserted into the MessageContext.
In the outgoing message, all transport specific information, like headers,
are added and sent.</p>


<p>To write your own transport, you will primarily need to write two classes:
one is the TransportSender and the other is the TransportReceiver. To
register a transport with Axis2 you will need to put entries corresponding
to these two classes in the axis2.xml file. I will take you through the 
process of adding the entries in the relevant sections.</p>

<section>
<h2><a name="Transport_Receiver"></a>Transport Receiver</h2>


<p>Any message that is coming into Axis2 needs to go through a transport
receiver. All information about how the message is received at the Axis2
server from the wire (or via an e-mail) is isolated inside the transport
receiver. It extracts the data that is coming on the wire and transforms it
into a state that the Axis2 server understands.</p>


<p>So now that we have some background information about how transports work
inside Axis2, without further delay, lets dive into some coding and start
building our own transport.</p>


<p></p>


<p>To get things stared, you will first need to extend from the
org.apache.Axis2.transport.TransportListener class and write your own
transport listener. To create an engine to process the MessageContext, we
need a configuration context. The following code fragment will do this. This
should ideally be only done once for the lifetime of the Transport
receiver.</p>


<p></p>

<div>
<pre>try {
        //Create a factory 
        ConfigurationContextFactory factory = new ConfigurationContextFactory();
        //Use the factory and an Axis2 repository to create a new Configuration Context
        configurationContext = ConfigurationContextFactory.createConfigurationContextFromFileSystem(repository_directory, 
axis2xmllocation);
} catch (Exception e) {
        log.info(e.getMessage());
}</pre></div>

<p>Now we need some kind of a Listener to listen to the requests that come
in. You need to implement this according to the transport that you are trying
to build. After a message is received at the Receiver, you can use the
following code to process the request and then forward the message context to
the engine using the engine.receive(msgContext) method. (The following code
is extracted from the MailListener as an example)</p>

<div>
<pre>AxisEngine engine = new AxisEngine(configurationContext);
MessageContext msgContext = null;

// create and initialize a message context
try {
        TransportInDescription transportIn =
                reg.getAxisConfiguration().getTransportIn(new QName(Constants.TRANSPORT_NAME));
        TransportOutDescription transportOut =
                reg.getAxisConfiguration().getTransportOut(new QName(Constants.TRANSPORT_NAME));
        if (transportIn != null &amp;&amp; transportOut != null) {
                //create Message Context
                
                msgContext = new MessageContext(configurationContext, transportIn, transportOut);
                msgContext.setServerSide(true);
                msgContext.setProperty(MailSrvConstants.CONTENT_TYPE, message.getContentType());
                msgContext.setProperty(MessageContext.CHARACTER_SET_ENCODING, message.getEncoding());

                String soapAction = message.getSOAPActionHeader();
                msgContext.setWSAAction(soapAction);
                msgContext.setSoapAction(soapAction);

                // Here we are trying to set the reply to if it is present in the transport information.
                msgContext.setReplyTo(new EndpointReference(message.getReplyTo());

                //Create the SOAP Message -- This code in from the mail transport and will change depending
                //on how the data is handled in each transport.
                ByteArrayInputStream bais = new ByteArrayInputStream(message.getContent().toString().getBytes());
                XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(bais);

                String soapNamespaceURI = &quot;&quot;;
                if(message.getContentType().indexOf(SOAP12Constants.SOAP_12_CONTENT_TYPE) &gt; -1){
                        soapNamespaceURI = SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI;
                }else if(message.getContentType().indexOf(SOAP11Constants.SOAP_11_CONTENT_TYPE) &gt; -1){
                        soapNamespaceURI = SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI;
                }

                StAXBuilder builder = new StAXSOAPModelBuilder(reader, soapNamespaceURI);

                SOAPEnvelope envelope = (SOAPEnvelope) builder.getDocumentElement();
                msgContext.setEnvelope(envelope);
                engine.receive(msgContext);
        } else {
                throw new AxisFault(Messages.getMessage(&quot;unknownTransport&quot;,Constants.TRANSPORT_NAME));
        }

} catch (Exception e) {
        try {
                if (msgContext != null) {
                        MessageContext faultContext = engine.createFaultMessageContext(msgContext, e);
                        engine.sendFault(faultContext);
                } else {
                        log.error(e);
                }
        } catch (AxisFault e1) {
                log.error(e);
        }
}</pre></div>

<p>Now that we have the coding in place, we need to let Axis2 know about our
new transport receiver. We do this by adding an entry into the axis2.xml
file. If you need to pass any properties for the transport to operate, it can
also be done through the axis2.xml file.</p>

<div>
<pre>   &lt;transportReceiver name=&quot;TRANSPORT_NAME&quot; class=&quot;org.apache.Axis2.transport.TRANSPORT_NAME.TRANSPORT_LISTNER_CLASS&quot;&gt;
        &lt;parameter name=&quot;PROPERTY_NAME&quot;&gt;PROPERTY_VALUE&lt;/parameter&gt;
        &lt;parameter name=&quot;PROPERTY_NAME_2&quot;&gt;PROPERTY_VALUE_2&lt;/parameter&gt;
  &lt;/transportReceiver&gt;
  </pre></div>

<p>By using a code fragment like
<code>Utils.getParameterValue(transportOut.getParameter(MailSrvConstants.SMTP_USER))</code>
we can extract the parameters that we inserted into the axis2.xml file.</p>


<p>As you can see, getting a new transport receiver up and running is a task
that requires very little effort.</p>

<section>
<h2><a name="Transport_Sender"></a>Transport Sender</h2>


<p>Any message that is to be sent out of Axis2, is sent through the Transport
Sender. The Transport Sender needs to be extended from the
org.apache.Axis2.transport.AbstractTransportSender class.</p>


<p>The following bit of code from the abstract transport sender will call the
Transport Sender that you wrote.</p>

<div>
<pre>// If an EPR is present then the message is going on a different channel.
if (epr != null) {
        out = openTheConnection(epr, msgContext);
        OutputStream newOut = startSendWithToAddress(msgContext, out);
        if (newOut != null) {
                out = newOut;
        }
        writeMessage(msgContext, out);
        finalizeSendWithToAddress(msgContext, out);
        } else {
        out = (OutputStream) msgContext.getProperty(MessageContext.TRANSPORT_OUT);
        if (out != null) {
                startSendWithOutputStreamFromIncomingConnection(msgContext, out);
                writeMessage(msgContext, out);
                finalizeSendWithOutputStreamFromIncomingConnection(msgContext, out);
        } else {
                throw new AxisFault(
                        &quot;Both the TO and Property MessageContext.TRANSPORT_WRITER is Null, No way to send response.&quot;);
        }
}</pre></div>

<p>Therefore, depending on whether your transport is using the same channel
to send the response or using a different channel, you will need to implement
a sub-set of the methods from the abstract class.</p>


<p>After implementing the necessary methods, you can let Axis2 know about
your new transport sender by adding an entry to the axis2.xml file, like you
did for the TransportReceiver.</p>

<div>
<pre>  &lt;transportSender name=&quot;TRANSPORT_NAME&quot; class=&quot;org.apache.Axis2.transport.TRANSPORT_NAME.TRANSPORT_SENDER_CLASS&quot;&gt;
        &lt;parameter name=&quot;PROPERTY_NAME&quot;&gt;PROPERTY_VALUE&lt;/parameter&gt;
        &lt;parameter name=&quot;PROPERTY_NAME_2&quot;&gt;PROPERTY_VALUE_2&lt;/parameter&gt;
  &lt;/transportSender&gt;
  </pre></div>

<p>Have a look at
org.apache.axis2.transport.http.impl.httpclient4.HTTPClient4TransportSender which is used to
send HTTP responses.</p>


<p>Once we have written our transport receiver and our transport sender, and
inserted the required entries into the axis2.xml file, we are done. It is as
simple as that!</p>

</html>
        </div>
      </div>
    </div>
    <hr/>
    <footer>
      <div class="container-fluid">
        <div class="row-fluid">
            <p>Copyright &copy;2004&#x2013;2021
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.</p>
        </div>
        </div>
    </footer>
    </body>
</html>