Я тестирую обработчики веб-сервисов, и я создал два макетных сервиса и макет клиента. Клиент (A) вызывает услугу (B), которая вызывает другую услугу (C). У меня есть один обработчик на B, а другой на C, оба просто печатают, что они были активированы. Я бы ожидал, что обработчик B активируется 4 раза (однажды, когда A свяжется с ним, когда он свяжется с C, один раз, когда C отвечает, и один раз, когда B должен ответить на A), но он активируется только тогда, когда A связывается с ним и когда он должен ответить A. Обработчик на C работает, как ожидалось (активируется дважды).Обработчик веб-сервиса не работает, когда служба вызывает другую услугу
У меня есть следующий код, который запускает службу и активирует клиент:
Endpoint.publish("http://localhost:8080/WSSecurity/helloworld", new WSDocEndpointImpl());
Endpoint.publish("http://localhost:8081/WSSecurity2/helloworld2", new WSDocEndpointImpl2());
URL wsdlUrl = new URL("http://localhost:8081/WSSecurity2/helloworld2?wsdl");
QName qname = new QName("http://webservice2.document.ftn.uns.ac.rs/", "WSDocEndpointImpl2Service");
Service service = Service.create(wsdlUrl, qname);
WSDocEndpoint2 helloWS = service.getPort(WSDocEndpoint2.class);
String response = helloWS.getHelloWorldAsString("Petar");
System.out.println(response);
Моих веб-сервисы:
@WebService(endpointInterface = "rs.ac.uns.ftn.document.webservice.WSDocEndpoint")
@HandlerChain(file = "/rs/ac/uns/ftn/document/handler-chain-document.xml")
public class WSDocEndpointImpl implements WSDocEndpoint {
@Override
public String getHelloWorldAsString(String name) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("ARRIVED AT WS 1 --- " + new Date());
return "Hello, " + name;
}
}
@WebService(endpointInterface = "rs.ac.uns.ftn.document.webservice2.WSDocEndpoint2")
@HandlerChain(file = "/rs/ac/uns/ftn/document/handler-chain-document2.xml")
public class WSDocEndpointImpl2 implements WSDocEndpoint2 {
@Override
public String getHelloWorldAsString(String name) {
try {
URL wsdlUrl = new URL(
"http://localhost:8080/WSSecurity/helloworld?wsdl");
QName qname = new QName(
"http://webservice.document.ftn.uns.ac.rs/",
"WSDocEndpointImplService");
Service service = Service.create(wsdlUrl, qname);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("ARRIVED AT WS 2 --- " + new Date());
WSDocEndpoint helloWS = service.getPort(WSDocEndpoint.class);
String responseFromWS1 = helloWS.getHelloWorldAsString("Petar");
return responseFromWS1;
} catch (Exception e) {
return "EXCEPTION!";
}
}
}
РУЧКА методы сообщения:
@Override
public boolean handleMessage(SOAPMessageContext context) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.err.println("TEST HANDLER! --- " + new Date());
return true;
}
И, наконец, xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<hc:handler-chains xmlns:hc="http://java.sun.com/xml/ns/javaee" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<hc:handler-chain>
<hc:handler>
<hc:handler-class>rs.ac.uns.ftn.document.handler.TestHandler</hc:handler-class>
</hc:handler>
</hc:handler-chain>
</hc:handler-chains>
Выход я на консоли:
TEST HANDLER 2! --- Fri May 15 18:58:35 CEST 2015
ARRIVED AT WS 2 --- Fri May 15 18:58:36 CEST 2015
TEST HANDLER! --- Fri May 15 18:58:38 CEST 2015
ARRIVED AT WS 1 --- Fri May 15 18:58:39 CEST 2015
TEST HANDLER! --- Fri May 15 18:58:41 CEST 2015
TEST HANDLER 2! --- Fri May 15 18:58:43 CEST 2015
Hello, Petar