blob: d8cfdc95861cd35e516f38964e40ae68ce492c1b [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="">
<title>Migrating from Axis 1.x</title>
</head>
<body lang="en">
<h1>Migrating from Axis 1.x to Axis 2</h1>
<h2>Compatibility</h2>
<p>Axis1.x and Axis2 have been evolved from different architectures.</p>
<p>Speed - Axis2 is based on StAX API, which gives greater speed than SAX
event base parsing that has been used in Axis1.x.</p>
<p>Stability - Axis2 has fixed phases and for extensions an area of user
defined phases. This allows far more stability and flexibility than
Axis1.x.</p>
<p>Transport framework - Simple abstraction designing of transports (i.e.,
senders and listeners for SOAP over various protocols such as SMTP, etc),
allow far more flexibility and the core of the engine is completely
transport-independent.</p>
<p>WSDL Support - Axis2 supports version 1.1 and 2.0, which allow creating
stubs and skeletons, to manipulate web service arena.</p>
<p>Component - Oriented Architecture - This is merely through archives (.mar
and .aar) . Easily reusable components such as Handlers, Modules allow
patterns processing for your applications, or to distribute to partners.
Axis2 more concern on the "Module" concept rather Handler concept. Modules
contain handlers that have been ordered through phase rules. which being
ordered to specific service(s).</p>
<h2>Getting Started</h2>
<p>Lets look at a simple example of echoing at client API</p>
<p><b>Axis 1.x</b></p>
<pre>import ..
public class TestClient {
public static void main(String [] args) {
try {
String endpoint = ...
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpoint) );
call.setOperationName(new QName("http://soapinterop.org/", echoString"));
String ret = (String) call.invoke( new Object[] { "Hello!" } );
System.out.println("Sent 'Hello!', got '" + ret + "'");
} catch (Exception e) {
System.err.println(e.toString());
}
}
}</pre>
<p><b>Axis 2</b></p>
<pre>import ....
public class EchoBlockingClient {
private static EndpointReference targetEPR = new EndpointReference(
AddressingConstants.WSA_TO,
"http://127.0.0.1:8080/axis2/services/MyService/echo");
public static void main(String[] args) {
try {
OMElement payload = ClientUtil.getEchoOMElement();
Call call = new Call();
call.setTo(targetEPR);
call.setTransportInfo(Constants.TRANSPORT_HTTP,Constants.TRANSPORT_HTTP,false);
//Blocking invocation
OMElement result = (OMElement) call.invokeBlocking("echo",payload);
...
} catch (AxisFault axisFault) {
axisFault.printStackTrace();
} catch (XMLStreamException e) {
e.printStackTrace();
}
}
}</pre>
<p>It has clearly depicted that the invocation in Axis2 is dealt with SOAP
body element itself. Here the invocation is synchronous, and Axis2 can handle
Asynchronous invocation as well. Above "payload" is the SOAP body element
which should go in the Envelop.</p>
<p>Once the service is called through Stub in Axis2, "payload" is according
to the data binding framework that will be using. So the extra work of
"payload" will be vanished.</p>
<p>Apart from Synchronous invocation, Axis2 support Asynchronous invocation
through invokeNonBlocking(). Synchronous/Asynchronous invocations can handle
both single/double HTTP connection.</p>
<p>With the advance architecture Axis2 is capable of handling Megabytes of
Requests and Responses, which is far form Axis1.x.</p>
<h2>Custom Deployment of Services, Handlers and Modules</h2>
<p>In Axis 1.x deployment of services is via WSDD, which is for my opinion
highly cumbersome. Service deployment in Axis2 is straight forward and
dynamic. Dynamic behavior is from the Administrator facility given by
development in server side. It's just a matter of creating a .aar file, and
deploying it ,which more detail is given in the Axis2 user guide.</p>
<p>Axis2 is far way from Handler concept and more into the Module concept,
which is abstractly speaking, a collection of handlers with Rules of
governing. Modules created as a .mar file. It has module.xml, which is the
brain behind manipulating handlers.</p>
<p>When a service is called through a handler, it is just a matter of giving
reference to the module that includes the handler in the service.xml. Apart
from that a handler can be directly called to a particular service, via
service.xml, no module is needed, and several handlers can be invoked when
the handlers are registered with the proper phases.</p>
<p>Services are hot deployable in Axis2 and dynamic, but Modules. This is one
feature, which is unique to Axis2.</p>
<h2>Transports for HTTP Connection</h2>
<p>Axis2 comes with two CommonsHTTPTransportSender which is based on
commons-httpclient. The configuration of the transport is as follows,</p>
<pre>call.setTransportInfo(Constants.TRANSPORT_HTTP, Constants.TRANSPORT_HTTP, false);</pre>
<p>It should be noted that axis2.xml should be configured to call the commons
transports, with the statement,</p>
<pre>...&lt;transportSender name="commons-http" class="org.apache.axis2.transport.http.CommonsHTTPTransportSender"&gt; &lt;parameter name="PROTOCOL" locked="xsd:false"&gt;HTTP/1.1&lt;/parameter&gt; &lt;parameter name="Transfer-Encoding" locked="xsd:false"&gt;chunked&lt;/parameter&gt;&lt;/transportSender&gt;...</pre>
<p>In above snippet it should be noted that transport is configured to handle
the chunked stream as well. Some web services, such as .NET web service
invocations are done through this transport, as it handle all possible HTTP
request and responses.</p>
<p>Data Binding Support</p>
<p>Xml-beans is used to provide data binding support. In Axis2, xml is
manipulated via AXIOM, which is based on StAX API. XML give full schema
support. Thus, serialization and de-serialization of Xml is handle in Axis2
via xml-data binding framework.</p>
<h2>Best Usage</h2>
<p>Axis1.x and Axis2 have different ways of seen the SOAP stack. So the best
way to migrate can be done through following the User guide and Architecture
guide properly in Axis2. Axis2 is straight forward and friendly.</p>
</body>
</html>