Chủ Nhật, 17 tháng 2, 2008

Tìm Hiểu Axis2 (Phần 1)

Giới thiệu Axis2:

Axis2 là một web service framework, nó được thiết kể để thực hiện các công việc:
+ Gửi SOAP messages
+ Nhận và xử lý SOAP messages
+ Tạo web service bằng lớp POJO
+ Tạo lớp cài đặt cho cả server và client sử dụng WSDL
+ Dễ dàng rút trích WSDL của service…

Bạn có ứng dụng được thiết kế để gửi và nhận message. Ở tầng giữa, bạn có Axis2. Giả sử Axis đang chạy ở hai phía client và server, tiến trình như sau:


+ Người gửi tạo SOAP message.
+ Axis handlers thực hiện các hành động cần thiết trên message như mã hóa (của WS-Security) thông tin có liên quan.
+ Trình vận chuyển sẽ gửi message.
+ Phía bên nhận, trình transport listener phát hiện message.
+ Chuyển message đến handlers ở phía nhận.
+ Một khi message được xử lý trong pha "pre-dispatch", nó sẽ được đưa đến dispatcher, sau đó nó sẽ được chuyển cho ứng dụng thích hợp.

Có hai phiên bản chính của Axis2:
+ Standard Binary Distribution: là phiên bản hoàn chỉnh của Axis, chứa sample và nhiều script hữu ích. Nó được sử dụng để cài đặt như một server độc lập.
+ WAR (Web Archive) Distribution: là ứng dụng web của Axis2, được triển khai trên hầu hết các trình chứa servlet.

Để phát triển các dịch vụ và ứng dụng, bạn sẽ cần bảng phân phối Standard Binary vì nó chứa tất cả file jar cần thiết cũng như các script hữu ích để dễ dàng phát triển ứng dụng (axis2.bat, axis2.sh, axis2server.bat, axis2server.sh, java2wsdl.bat, java2wsdl.sh, wsdl2java.bat, wsdl2java.sh, setenv.sh). Download hai phiên bản tại: http://ws.apache.org/axis2/download/1_3/download.cgi

Cài Axis2 như một phần của trình chứa servlet tương thích J2EE:
+ Download http://apache.oregonstate.edu/ws/axis2/1_3/axis2-1.3-war.zip
+ Giải nén, bỏ file war vào webapps của Tomcat: C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps
+ http://127.0.0.1:8989/axis2/ (username/passwd là admin/axis2)

Ứng dụng mẫu:

+ Cấu trúc của ứng dụng
projectname
+ src
+ org.sample.service
+ BusinessService
+ test
+ org.sample.service
+ BusinessTest
+ resources
+ META-INF
+ services.xml
build.xml

+ Tạo lớp service:
BusinessService.java
package org.sample.service;

public class BusinessService {

public Float calShippingCode(Integer zip, Float weight) {
return new Float(zip.intValue() * weight.floatValue());
}
}

+ Tạo services.xml định nghĩa service (hoặc có thể phát sinh ra .wsdl file bằng lệnh ant generate.wsdl)

+ Sử dụng ant để biên dịch và phát sinh .aar file
;



















;







































+ Deploy service bằng hai cách:
Sử dụng trang upload để upload .aar file hoặc bỏ trực tiếp vào C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\axis2\WEB-INF\services

+ Kiểm tra thông tin service
http://127.0.0.1:8989/axis2/services/listServices <= liệt kê tất cả service được deploy
http://127.0.0.1:8989/axis2/services/businessService?wsdl <= file mô tả webservice
http://127.0.0.1:8989/axis2/services/businessService?xsd <= file định nghĩa XML scheme
http://127.0.0.1:8989/axis2/services/businessService/calShippingCode?weight=25 <= gọi hàm và cung cấp giá trị cho tham số weight

+ Viết lớp client gọi businessService:
BusinessTest.java
package org.sample.service;

import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;

public class BusinessTest {
      public static void main(String[] args) throws AxisFault {
            RPCServiceClient serviceClient = new RPCServiceClient();

            Options options = serviceClient.getOptions();

            EndpointReference targetEPR = new EndpointReference(
                        "http://127.0.0.1:8989/axis2/services/businessService");
            options.setTo(targetEPR);

            // calculate shipping code
            QName calShippingCode = new QName("http://service.sample.org/xsd",
                        "calShippingCode");

            // Constructing the arguments array for the method invocation
            Object[] opWeightArgs = new Object[] { new Integer(2), new Float(45.6) };
            Class[] returnTypes = new Class[] { Float.class };

            // Invoking the method
            Object[] response = serviceClient.invokeBlocking(calShippingCode,
                        opWeightArgs, returnTypes);
            Float shippingCode = (Float) response[0];
            System.out.println("Shipping Code:" + shippingCode);
      }
}


Deploy POJO Spring:

+ Service class
PersonService.java
package org.sample.service;

import org.sample.model.Person;

public class PersonService {
     
      private Person person;

      public Person getPerson() {
            return person;
      }

      public void setPerson(Person person) {
            this.person = person;
      }

}

+ Model class
Person.java

package org.sample.model;

public class Person {
     
      private Integer personId;
     
      private String personName;
     
      private String address;

      public Integer getPersonId() {
            return personId;
      }

      public void setPersonId(Integer personId) {
            this.personId = personId;
      }

      public String getPersonName() {
            return personName;
      }

      public void setPersonName(String personName) {
            this.personName = personName;
      }

      public String getAddress() {
            return address;
      }

      public void setAddress(String address) {
            this.address = address;
      }

}


+ applicationContext.xml (without a ServletContext)


class="org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder"/>












+ services.xml


This web service initializes Spring.

org.sample.service.SpringInit

composite
true

class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>




+ Client class
PersonSpringClient.java

package org.sample.client;

import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import org.sample.model.Person;

public class PersonSpringClient {

      public static void main(String[] args) throws AxisFault {
            RPCServiceClient serviceClient = new RPCServiceClient();

            Options options = serviceClient.getOptions();

            EndpointReference targetEPR = new EndpointReference(
                        "http://127.0.0.1:8989/axis2/services/PersonSpringService");

            options.setTo(targetEPR);

            // Setting the weather
            QName opSetPerson = new QName("http://service.sample.org", "setPerson");

            Person person = new Person();
            person.setPersonId(new Integer(3));
            person.setPersonName("Trinh Nguyen");
            person.setAddress("CMT8, District 3");

            Object[] opSetPersonArgs = new Object[] { person };

            serviceClient.invokeRobust(opSetPerson, opSetPersonArgs);

            // Getting the person
            QName opGetPerson = new QName("http://service.sample.org", "getPerson");

            Object[] opGetPersonArgs = new Object[] {};
            Class[] returnTypes = new Class[] { Person.class };

            Object[] response = serviceClient.invokeBlocking(opGetPerson,
                        opGetPersonArgs, returnTypes);

            Person result = (Person) response[0];

            if (result == null) {
                  System.out.println("Person doesn't exist!");
                  return;
            }

            // Displaying the result
            System.out.println("PersonId             : " + result.getPersonId());
            System.out.println("PersonName           : " + result.getPersonName());
            System.out.println("Address              : " + result.getAddress());

      }
}

+ Project layout

+ Tạo aar file
build.xml
















value="${env.CATALINA_HOME}/webapps/axis2/WEB-INF/services"/>











































tofile="${dest.dir.classes}/META-INF/services.xml" overwrite="true"/>
tofile="${dest.dir.classes}/applicationContext.xml"
overwrite="true"/>

includes="org/**">



destfile="${dest.dir}/${service-name}.aar"/>

tofile="${repository.path}/services/${service-name}.aar"
overwrite="true"/>







includes="org/sample/client/**">




























unless="spring_available">


src="http://ws.zones.apache.org/repository/org.springframework/jars/spring-core-1.2.8.jar"
dest="lib/spring-core-1.2.8.jar" verbose="true"/>
src="http://ws.zones.apache.org/repository/org.springframework/jars/spring-context-1.2.8.jar"
dest="lib/spring-context-1.2.8.jar" verbose="true"/>
src="http://ws.zones.apache.org/repository/org.springframework/jars/spring-beans-1.2.8.jar"
dest="lib/spring-beans-1.2.8.jar" verbose="true"/>






+ Thư viện cần thiết
log4j.jar
commons-logging-1.1.jar
spring-context-1.2.8.jar
spring-beans-1.2.8.jar
spring-core-1.2.8.jar
spring.jar
Copy jar files đến thư mục lib của tomcat_home

Không có nhận xét nào:

Đăng nhận xét