Могу ли я глобально установить тайм-аут HTTP-соединений? - PullRequest
17 голосов
/ 30 марта 2012

У меня есть программа, которая использует javax.xml.ws.Service для вызова удаленной службы, определенной WSDL.Эта программа работает в Google App Engine, который по умолчанию устанавливает время ожидания HTTP-соединения на 5 секунд {1}.Мне нужно увеличить значение этого тайм-аута, так как этот сервис часто требует много времени для ответа, но поскольку этот запрос не выполняется с помощью URLConnection, я не могу понять, как вызвать URLConnection.setReadTimeout(int) {2}, или как-то иначе изменить тайм-аут,

Есть ли способ глобально установить тайм-аут HTTP-соединения на App Engine?И в целях обмена знаниями, как можно было бы решить проблему такого рода вообще?

{1}: https://developers.google.com/appengine/docs/java/urlfetch/overview#Requests

{2}: http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URLConnection.html#setReadTimeout(int)

Ответы [ 4 ]

14 голосов
/ 22 мая 2012

Вы можете попробовать установить системные свойства sun.net.client.defaultConnectTimeout и sun.net.client.defaultReadTimeout, задокументированные здесь , например

System.setProperty("sun.net.client.defaultReadTimeout", "30000");
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");

РЕДАКТИРОВАТЬ

Извините, просто перечитайте и заметили, что это на Google App Engine.Я не знаю наверняка, но учитывая спорные отношения между Google и Oracle в последнее время, я предполагаю, что GAE не работает с Oracle JVM.Я оставлю это здесь на случай, если кто-то столкнется с подобной проблемой.

8 голосов
/ 22 мая 2012

Попробуйте это:

Port port = service.getPort(endPointInterface);  //or another "getPort(...)"
((BindingProvider) port).getRequestContext()
    .put(BindingProviderProperties.REQUEST_TIMEOUT, 30);
4 голосов
/ 04 мая 2012

См. https://developers.google.com/appengine/docs/java/urlfetch/usingjavanet

Вы можете сделать что-то подобное, чтобы получить URLConnection:

    URL url = new URL("http://www.example.com/atom.xml");
    URLConnection tempConnection = url.openConnection();
    tempConnection.setReadTimeout(10);
1 голос
/ 24 апреля 2015

Для App Engine с JAX-WS вы должны установить контекст запроса (протестировано сегодня с SDK 1.9.15).Для обычных машин вы не можете перейти выше 60 с, и вам придется переключиться на более крупные машины (Bx) для лучшего использования очереди задач.

Для локального тестирования вы обычно используете BindingProviderProperties.CONNECT_TIMEOUT и BindingProviderProperties.REQUEST_TIMEOUT, ноих нет в белом списке JRE App Engine, и проверка кода может постоянно предупреждать вас об этом.Однако можно использовать эквивалентные строки:

com.sun.xml.internal.ws.connect.timeout
com.sun.xml.internal.ws.connect.timeout

Для развертывания в App Engine:

com.sun.xml.ws.connect.timeout
com.sun.xml.ws.request.timeout

Полный пример того, как применить это к автоматически сгенерированному коду из JAX-WS 2.x, значения должны быть указаны в миллисекундах:

@WebEndpoint(name = "Your.RandomServicePort")
public YourServiceInterface getYourRandomServicePort() {
    YourRandomServiceInterface port = super.getPort(YOURRANDOMSERVICE_QNAME_PORT, YourRandomServiceInterface.class);
    Map<String, Object> requestContext = ((BindingProvider)port).getRequestContext();
    requestContext.put("com.sun.xml.ws.connect.timeout", 10000);
    requestContext.put("com.sun.xml.ws.request.timeout", 10000);
    return port;
}
...