Сравнение скорости работы четырех клиентов веб сервисов

В статье дан пример создания совсем простого веб сервиса методом обратного проектирования. В качестве сервера приложений был взят jBoss 4.2. На этой тестовой площадке созданы четыре клиента: AXIS, JAX-WS (wsimport), Castor и простой парсер на XmlPullParser. Результаты скорости работы этих клиентов приведены в таблице. Статья включает в себя фрагменты исходного кода. Тестовые примеры доступны для скачивания.

Зачем все это.

В процессе работы нам приходится сталкиваться с различными вариантами реализации клиентов веб сервисов. Сравнивая их по производительности и сложности разработки, мы старались найти оптимальный вариант для различных ситуаций. Мы убедились что нельзя замыкаться на каком-то одном варианте. Окончательный выбор во многом зависит от конкретных условий.

В этом примере мы покажем как сделать простой тестовый веб сервис и сравним скорость работы 4 различных клиентов.

Веб сервис.

Для теста мы не станем придумывать ничего сложного. Клиент будет посылать строку, сервер поменяет слова местами и вернет обратно.
Начнем проектирование веб сервиса с написания WSDL файла. В нем опишем интерфейс сервиса и объекты таким образом:

Интерфейс сервиса:

 <message name="jokerRequest">
  <part name="rq" element="tws:methodRequest"/>
 </message>

 <message name="jokerResponse">
  <part name="rs" element="tws:methodResponse"/>
 </message>

Объекты запроса и ответа:

 <xsd:element name="methodRequest">
  <xsd:annotation>
   <xsd:documentation xml:lang="en">Joker request.</xsd:documentation>
  </xsd:annotation>
  <xsd:complexType>
   <xsd:attribute name="reqString" type="xsd:string" use="required" />
  </xsd:complexType>
 </xsd:element>
 			
 <xsd:element name="methodResponse">
  <xsd:annotation>
   <xsd:documentation xml:lang="en">Joker response.</xsd:documentation>
  </xsd:annotation>
  <xsd:complexType>
   <xsd:attribute name="resString" type="xsd:string" use="required" />
  </xsd:complexType>
 </xsd:element>

Описание сервиса. Пусть будет на 80 порту:

 <service name="Joker">
  <port name="Joker" binding="tws:jokerSOAPBinding">
   <soap:address location="http://localhost"/>
  </port>
 </service>

Полный WSDL можно скачать ниже.

Теперь, точно так же, как написано в предыдущей статье, сгенерируем объекты и интерфейс сервиса:

%JAVA_HOME%\bin\wsimport.exe test.wsdl -s src -d classes

Готово. Вот такой список файлов получился:

  • localhost
    • Joker_Service.java
    • Joker.java
    • MethodRequest.java
    • MethodResponse.java
    • ObjectFactory.java
    • package-info.java

Самое страшное позади. Осталось написать имплементацию сервиса и выложить все на сервер. Делаем файл JokerImpl.java реализующий интерфейс Joker:

 package localhost;
 
 import java.util.StringTokenizer;
 import javax.ejb.TransactionAttribute;
 import javax.ejb.TransactionAttributeType;
 import javax.jws.WebMethod;
 import javax.jws.WebParam;
 import javax.jws.WebResult;
 import javax.jws.WebService;
 import javax.jws.soap.SOAPBinding;
 import org.jboss.wsf.spi.annotation.WebContext;

 @WebService(serviceName = "Joker", name = "Joker", targetNamespace = "http://localhost")
 @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
 @WebContext( contextRoot = "/joker" , urlPattern="/wsbase" )
 public class JokerImpl implements Joker {

  @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
  @WebMethod
  @WebResult(name = "methodResponse", targetNamespace = "http://localhost", partName = "rs")
  public MethodResponse shift(@WebParam(name = "methodRequest", targetNamespace = "http://localhost", partName = "rq") MethodRequest rq) {
   String ret = "";
   StringTokenizer tokenizer = new StringTokenizer(rq.getReqString(), "+");
   while (tokenizer.hasMoreTokens()) {
    ret = tokenizer.nextToken() + "+" + ret;
   }
   MethodResponse res = new MethodResponse();
   res.setResString(ret);
   return res;
  
  }
 }

Добавление нескольких аннотаций потребует подключения к проекту пары библиотек из набора сервера JBoss. Это jboss-ejb3x.jar и jbossws-spi.jar. Как видно из кода, после публикации мы сможем найти WSDL нашего сервиса по следующему адресу: http://localhost/joker/wsbase?wsdl

Теперь создаем пакет для публикации вот в таком виде:

  • joker.ear
    • joker.jar
      • localhost
        • Joker_Service.class
        • Joker.class
        • JokerImpl.class
        • MethodRequest.class
        • ObjectFactory.class
        • package-info.class
      • META-INF
        • MANIFEST.MF
  • META-INF
    • application.xml

Содержание application.xml:

 <application>
  <display-name>joker</display-name>
  <module>
   <java>joker.jar</java>
  </module>
 </application>

Совсем не обязательно паковать joker.ear. Во всяком случае, нам намного удобнее вносить изменения в проект в таком виде. А серверу все равно. Поместим папку joker.ear сюда: jboss/server/default/deploy/. При запуске необходимо убедиться, что все порты, необходимые серверу JBoss свободны. Если все прошло успешно, то, как и планировали, WSDL появиться тут: http://localhost/joker/wsbase?wsdl

Страница: