Могу ли я глобально установить тайм-аут HTTP-соединений?
У меня есть программа, которая использует 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)
Ответы
Ответ 1
Вы можете попробовать установить системные свойства 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 не запускает JVM Oracle. Я оставлю это здесь, если кто-то другой столкнется с аналогичной проблемой.
Ответ 2
Попробуйте следующее:
Port port = service.getPort(endPointInterface); //or another "getPort(...)"
((BindingProvider) port).getRequestContext()
.put(BindingProviderProperties.REQUEST_TIMEOUT, 30);
Ответ 3
См. 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);
Ответ 4
Для App Engine с JAX-WS вам нужно установить контекст запроса (проверенный сегодня с помощью SDK 1.9.15). Для обычных машин вы не можете идти выше 60 секунд и должны переключаться на более крупные машины (Bx) для лучшего использования очереди задач.
Для локального тестирования вы обычно используете BindingProviderProperties.CONNECT_TIMEOUT и BindingProviderProperties.REQUEST_TIMEOUT, но они не входят в белый список приложений JRE, и проверка кода может постоянно предупреждать вас об этом.
Можно использовать эквивалентные строки:
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;
}