Установка времени ожидания jax-ws
У меня проблема с настройкой времени ожидания jax-ws. Мой код:
@WebServiceClient(name = "VoipDBJDBCService", targetNamespace = "http://db.server.voipmeter.jextreme.eu/", wsdlLocation = "http://trace0.nyc.blinkmind.com:8080/voipdb?wsdl")
public class VoipDBJDBCService extends Service {
public VoipDBJDBCService(URL wsdlLocation) {
super(wsdlLocation, new QName("http://db.server.voipmeter.jextreme.eu/", "VoipDBJDBCService"));
}
@WebEndpoint(name = "VoipDBJDBCPort")
public VoipDB getVoipDBJDBCPort() {
return super.getPort(new QName("http://db.server.voipmeter.jextreme.eu/", "VoipDBJDBCPort"), VoipDB.class);
}
}
И использование:
VoipDB db = new VoipDBJDBCService(new URL(url)).getVoipDBJDBCPort();
Как подключиться к тайм-аутам? Я нашел "решение" здесь: https://jax-ws.dev.java.net/guide/HTTP_Timeouts.html, но я не знаю, где его подключить. Как получить прокси? Когда я вызываю, клиент getPort пытается подключиться, а затем вешает навсегда, если сервер не отвечает.
UPDATE:
Этот код вызывается из метода applets init(), если это имеет значение.
Ответы
Ответ 1
С Metro/Glassfish...
//1 minute for connection
((BindingProvider) wsPort).getRequestContext().put("com.sun.xml.ws.connect.timeout", 1 * 60 * 1000);
//3 minutos for request
((BindingProvider) wsPort).getRequestContext().put("com.sun.xml.ws.request.timeout", 3 * 60 * 1000);
Ответ 2
Если вы используете Sun JRE, вы можете установить следующие системные свойства для сетевых подключений по умолчанию и таймаутов чтения (в миллисекундах). Я не пробовал их с клиентом JAX-WS, но они тоже должны работать:
sun.net.client.defaultConnectTimeout
sun.net.client.defaultReadTimeout
Дополнение: Я пропустил вашу последнюю часть вопроса, где вы сказали, что делаете это в апплете. Если апплет работает с разрешениями по умолчанию, вам, вероятно, не разрешено устанавливать системные свойства.
Ответ 3
ProxyWs proxy = (ProxyWs) factory.create();
Client client = ClientProxy.getClient(proxy);
HTTPConduit http = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(0);
httpClientPolicy.setReceiveTimeout(0);
http.setClient(httpClientPolicy);
Это сработало для меня.
Ответ 4
Вы можете направить объект VoipDB
на BindingProvider
. Итак, в примере в ссылке вы просто заменили proxy
на db
, и вам хорошо идти.
Ответ 5
Вот один пример
public void testConfigureTimeout() throws Exception
{
//Set timeout until a connection is established
((BindingProvider)port).getRequestContext()
.put("javax.xml.ws.client.connectionTimeout", "6000");
//Set timeout until the response is received
((BindingProvider) port).getRequestContext()
.put("javax.xml.ws.client.receiveTimeout", "1000");
port.echo("testTimeout");
}