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.

Другие вопросы по тегам