суббота, 22 августа 2009 г.

Apache Axis2 – пример использования

Что такое «Ось» - палка от колес, а если в контексте механизма Web-сервисов, это Axis2 (Axis – ось eng.). Проект прославленной группы разработчиков Apache или «Java-образная» реализация Фреймворка технологии Web-сервисов. В данной статье, я хочу, на примере использования, показать способ разработки приложений с Web-сервисной архитектурой.



В предыдущей статье Что такое web-сервисы и с чем их едят, я попытался показать и описать механизм взаимодействия приложений по средствам клиент-серверной технологии - Web-сервисов. Теперь для более детального изучения этого «механизма», я хочу привести пример интеграции приложения, а точнее двух приложений: клиента и сервера, по средствам web-cервис движка или можно сказать сервера - Apache Axis2.

Судя по названию сервера это второе поколение продукта от Apache основанное на наработках при создании первого Axis 1.0, но с совершенно отличающейся архитектурой.


Необходимые инструменты

И так для работы нам понадобится:
jdk-1.5 (или выше)
Web-север Tomcat 6.0– http://tomcat.apache.org/download-60.cgi
Axis2 1.3 - http://ws.apache.org/axis2/download.cgi
Ant 1.6.5 - http://ant.apache.org/bindownload.cgi


Так как мы собираемся написать java приложение, соответственно нам необходимо иметь установленную и настроенную JDK. При написания статьи я использовал JDK версии 1.5.0_10. Процесс установки и настройки java в системе описан мною, в соответствующей статье Установка и настройка java.


Axis2 является серверным приложением, поэтому его можно запускать в отдельном процессе, но так как в большинстве случаев web-сервис архитектура связанна с нагрузками и требует кластеризации и маршрутизации(процесс разделения нагрузок на сервер), по этому его (Axis2) разворачивают как web-приложение на севере приложений EAS (Enterprise Application Server), в данном случае для простоты будем использовать Apache Tomcat 6.0.
Процесс установки и настройки Tomcat web-севера, описан мною, в соответствующей статье Установка и Tomcat web-сервера.

Установка Axis2 как web-приложение

Распаковав загруженный архив, мы получим следующую структуру каталога.

Рисунок 1.
В Папке «dist» находится файл «axis2.war» - это и есть web-приложение Axis2. Его необходимо развернуть на web-сервере, в нашем случае это Tomcat, для этого можно просто скопировать этот файл в папку "<TOMCAT_HOME>/webapps", Tomcat сам определит и развернет приложение.

В результате в списке web-приложение сервера Tomcat (http://[host]:[port]/manager/html)
появится новое приложение axis2


Рисунок 2.

Обзор web-интерфейса Axis2

На первой странице web-интерфейса сервера Axis2, размещены ссылки на три основные страницы основные


Рисунок 3.

Services – Список сервисов которые развернуты на сервере.


Рисунок 4.

По умолчанию в качестве примера сервиса используется сервис, который возвращает версию сервера - Version.


Validate – Страница с результатами проверки системы на наличие необходимых
библиотек и общей статистической информацией о системе.

Administration – Собственно, интерфейс администратора

Для входа в панель администратора необходимо авторизоваться


Рисунок 5.

По умолчанию имя пользователя – admin, пароль пользователя – axis2
Эти значения можно поменять, отредактировав секции

<parameter name="userName">admin</parameter>
<parameter name="password">axis2</parameter>

В файле "<TOMCAT_HOME>\webapps\axis2\WEB-INF\conf\axis2.xml"
Каркас сервиса

И так, настало время написать каркас нашего сервиса.

При разработке данного примера я использовал в качестве сборщика очень удобную утилиту – Ant, это утилита написанная на java для организации процесса сборки java приложений и не только. Очень удобная вещь, постараюсь рассказать о ней позже в следующей статье.

И так наш проект имеет следующую структуру:


Рисунок 6.

Это не эталон, структуру можно поменять, по своему усмотрению, с соответственными изменениями в скриптах сборки.

Как можно догадаться по названию папок:
build – откомпилированный код
dist – архив сборки
lib – необходимые библиотеки
src – исходные коды
build.xml – скрипт для сборки проекта

И так перейдем к исходным кодам.

Сначала создадим класс SimpleService, в пакете my.services
package my.services;

public class SimpleService {
public String sayHello() {

return "Hello World!!!";
}
}

Как видно из листинга это простой класс с одним методом sayHello, который возвращает строку со значением «Hello World!!!» :)

Теперь для того чтобы указать Axis2 серверу, что это у нас web-сервис, необходимо создать xml дескриптор описывающий наш сервис. Для этого создадим папку META-INF
в папке src и создадим в папке META-INF файл services.xml со следующим содержимым.
<service name="SimpleService">
<description>
This service is to say the Hello World
</description>
<parameter name="ServiceClass" locked="false">my.services.SimpleService</parameter>
</service>


Судя по названиям узлов в файле, можно сразу догадаться:

<service>…</service> – секция описания сервиса
name=”SimpleService” - имя нашего сервиса

<description>…</description> - это описание сервиса, полезно заполнять это поле для будущих пользователей сервиса

<parameter name="ServiceClass" locked="false">my.services.SimpleService</parameter> - собственно имя класса с указанием антиблокировки :)

Файл дескриптора может содержать и другие секции, но об этом позже.


Сборка сервиса
После создания xml дескриптора и написания функционала, нам необходимо собрать проект, для этого, как я уже сказал выше, будем использовать Ant.

Весь процесс сборки с помощью Ant основывается на определении целей (правил) сборки в xml файле – build.xml. ниже я приведу пример такого файла с подробными комментариями внутри.
<project name="SimpleAxis2" basedir="." default="aar.server">
<!-- Определяем необходимые параметры-->
<!—Директории -->
<property name="src.dir" value="${basedir}/src" />
<property name="build.dir" value="${basedir}/build" />
<property name="dist.dir" value="${basedir}/dist" />
<property name="lib.dir" value="${basedir}/lib" />
<property name="axis2.home" value="C:\apache.jakarta\axis2" />

<!-- Web Service Name -->
<property name="service.name" value="SimpleService" />
<!-- Web Service Namespace -->
<property name="service.namespace" value="http://services.my" />
<!-- Web Service Data Namespace -->
<property name="services.data.namespace" value="http://data.example.second.axis2.my" />
<!-- Java Package Name -->
<property name="service.java.packageName" value="my.services" />
<!-- Name of Java Implementation Class-->
<property name="service.java.name" value="SimpleService" />
<!-- Java Class Name with Package Information-->
<property name="service.class" value="${service.java.packageName}.${service.java.name}" />
<!-- WSDL file name -->
<property name="service.wsdl" value="${service.name}.wsdl" />


<!-- CLASSPATH -->
<path id="classpath">
<!-- Moved from Java 2 Wsdl -->
<pathelement location="${build.dir}" />
<fileset dir="${axis2.home}\lib">
<include name="*.jar" />
</fileset>
</path>
<property name="axis2.classpath" value="classpath" />

<!-- Очищаем директории  -->
<target name="clean">
<delete dir="${build.dir}" />
</target>

<!-- Компилируем исходные коды -->
<target name="compile" depends="clean">
<mkdir dir="${build.dir}" />

<!--First let's compile the classes-->
<javac debug="on" fork="true" destdir="${build.dir}" srcdir="${basedir}/src" classpathref="classpath">
</javac>
</target>

<!-- Создаем архив сервиса -->
<target name="aar.server" depends="compile">
<mkdir dir="${build.dir}/META-INF" />
<mkdir dir="${build.dir}/lib" />
<!--copy file="${build.lib}/${xbeans.packaged.jar.name}" toDir="${build.classes}/lib" /-->
<copy toDir="${build.dir}/META-INF">
<fileset dir="${src.dir}/META-INF" />
</copy>
<jar destfile="${dist.dir}/${service.name}.aar">
<fileset dir="${build.dir}"/>
</jar>
</target>
</project>

Файл build.xml должен находится в корне проекта (те на одном уровне с папками src и build)

Теперь для сборки проекта в командной строке, необходимо выполнить след команду.

> ant

Ant сборщик автоматически подхватит файл build.xml и основываясь на его целях (правилах) соберет проект.

Развертывание на сервере

Теперь после сборки проекта в папке dist должен появится файл-архив с со всеми необходимыми файлами для сервиса
Для развертывания его на Axis сервере, необходимо скопировать его в папку
"<TOMCAT_HOME>\webapps\axis2\WEB-INF\services\"
Axis сервер, автоматически определит его и развернет в своем контейнере.

Результат можно увидеть на странице
http://localhost:8080/axis2/services/listServices
(для локального сервера)


Рисунок 7.
Как видно на рисунке, в списке развернутых сервисов, появился наш сервис «SimpleService» с одним методом sayHello.


В следующей статье я планирую описать процесс создания клиента для нашего SimpleService.

Жду ваших отзывов и предложений.



Комментариев нет: