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