2015-05-15 1 views
0

Я тестирую обработчики веб-сервисов, и я создал два макетных сервиса и макет клиента. Клиент (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 

ответ

0

Проблема заключалась в том, как я написал свой код. Когда мой веб-сервис выступал в роли клиента, он не обрабатывал обработчик. Мне пришлось создать клиент веб-сервиса для моего веб-сервиса и зарегистрировать обработчик на нем, а затем использовать его для вызова моего другого веб-сервиса.