Jax-ws устанавливает тайм-аут соединения для чтения wsdl и отправки запроса
Наше приложение должно отправить запрос в службу SOAP. Мы используем команду wsimport для генерации класса для нашего клиента. Но иногда, когда сервис не работает или какие-то проблемы с сетью, наш запрос зависает до истечения времени ожидания, и это слишком долго. Мы хотим контролировать значение тайм-аута, поэтому мы пытаемся использовать несколько методов.
Для вызова метода сервиса, после прочтения из другого поста, мы установили что-то вроде этого:
((BindingProvider) port).getRequestContext().put("sun.net.client.defaultReadTimeout", 3000);
((BindingProvider) port).getRequestContext().put("sun.net.client.defaultConnectTimeout", 10000);
Но перед этим мы должны вызвать get port, который будет читать файл wsdl. Мы пытаемся создать URL следующим образом:
url = new URL(null, "http://theirsite/WS?WSDL", new URLStreamHandler() {
@Override
protected URLConnection openConnection(URL url) throws IOException {
logger.info("URLStreamHandler got call!");
URL clone_url = new URL(url.toString());
HttpURLConnection clone_connection
= (HttpURLConnection) clone_url.openConnection();
clone_connection.setConnectTimeout(5000);
clone_connection.setReadTimeout(3000);
return (clone_connection);
}
});
И затем мы используем этот URL в качестве параметра при создании объекта службы. Но наш URLStreamHandler так и не получил вызов.
Мы даже пытаемся установить системное свойство следующим образом:
System.setProperty("sun.net.client.defaultReadTimeout", "" + 3000);
System.setProperty("sun.net.client.defaultConnectTimeout", "" + 5000);
Но пока у нас ничего не работает.
Таким образом, any1 может помочь мне с этим делом? Или есть лучший подход? Нужно отметить, что мы не хотим читать файл wsdl из локальной сети.
1 ответ
Возможно, используемые вами свойства не являются правильными.
Попробуйте эти:
((javax.xml.ws.BindingProvider) port).getRequestContext().put("com.sun.xml.internal.ws.connect.timeout",
Integer.valueOf(timeout));
((javax.xml.ws.BindingProvider) port).getRequestContext().put("com.sun.xml.internal.ws.request.timeout",
Integer.valueOf(timeout));
Кроме того, будьте осторожны, есть разница между com.sun.xml.ws.request.timeout
а также com.sun.xml.internal.ws.request.timeout
, Вам следует использовать внутреннюю, когда вы работаете с реализацией JDK JAX-WS.