Сравнение скорости работы четырех клиентов веб сервисов
Зачем все это.
В процессе работы нам приходится сталкиваться с различными вариантами реализации клиентов веб сервисов. Сравнивая их по производительности и сложности разработки, мы старались найти оптимальный вариант для различных ситуаций. Мы убедились что нельзя замыкаться на каком-то одном варианте. Окончательный выбор во многом зависит от конкретных условий.
В этом примере мы покажем как сделать простой тестовый веб сервис и сравним скорость работы 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 можно скачать ниже.
Теперь, точно так же, как написано в предыдущей статье, сгенерируем объекты и интерфейс сервиса:
Готово. Вот такой список файлов получился:
- 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
- localhost
- joker.jar
- 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