Установка тайм-аута чтения сокета с помощью javax.XML.мыло.SOAPConnection
Я использую javax.xml.soap
API-интерфейс (javax.xml.soap.SOAPConnectionFactory
, javax.xml.soap.SOAPConnection
, и друзья), чтобы сделать вызов веб-службы на удаленный сервер, по большей части с большим успехом.
однако иногда возникает проблема, и программа застревает чтение навсегда.
чтобы решить эту проблему, я хотел бы добавить тайм-аут чтения.
Я нашел несколько способов достичь этого, но все они казались довольно плохими.
поэтому мой вопрос к сообществу: что такое лучший способ реализовать поведение тайм-аута чтения при использовании javax.XML.soap API для вызова?
2 ответов
вы должны создать свой собственный 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);
Я удалил некоторые try / catch для ясности.
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();
}