Установка времени ожидания чтения сокета с помощью javax.xml.soap.SOAPConnection - PullRequest
13 голосов
/ 02 марта 2012

Я использую API javax.xml.soap (javax.xml.soap.SOAPConnectionFactory, javax.xml.soap.SOAPConnection и друзья) для вызова веб-службы на удаленный сервер, по большей части с большим успехом.

Однако,иногда возникает проблема, и программа застревает при чтении навсегда.

Чтобы решить эту проблему, я хотел бы добавить тайм-аут чтения.

Я нашел несколько способов, которыми можно достичь этого, но все они казались довольно плохими.

Так что мой вопрос к сообществу: каков наилучший способ реализовать поведение тайм-аута чтения при использовании API javax.xml.soap для совершения вызова?

Ответы [ 2 ]

32 голосов
/ 13 марта 2012

Вы должны создать свой собственный URLStreamHandler , чтобы вы могли установить URLConnection параметры, такие как время ожидания подключения и время ожидания чтения.

SOAPConnection connection = SOAPConnectionFactory.newInstance().createConnection();
URL endpoint =
  new URL(new URL("http://yourserver.yourdomain.com/"),
          "/path/to/webservice",
          new URLStreamHandler() {
            @Override
            protected URLConnection openConnection(URL url) throws IOException {
              URL target = new URL(url.toString());
              URLConnection connection = target.openConnection();
              // Connection settings
              connection.setConnectTimeout(10000); // 10 sec
              connection.setReadTimeout(60000); // 1 min
              return(connection);
            }
          });

SOAPMessage result = connection.call(soapMessage, endpoint);

Я удалил некоторые попытки/ поймать для ясности.

2 голосов
/ 02 марта 2012
import com.sun.xml.internal.ws.client.BindingProviderProperties

public someResponse callWebService() {

    MyPort port = new Service().getPort();

    Map<String, Object> requestContext = ((BindingProvider) port).getRequestContext();

    requestContext.put(BindingProviderProperties.CONNECT_TIMEOUT, 10 * 1000); //10 secs

    requestContext.put(BindingProviderProperties.REQUEST_TIMEOUT, 1 * 60 * 1000); //1 min

    return port.someWebMethod();

}
...