Могу ли я глобально установить тайм-аут 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);

Ответ 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;
}