SocketTimeoutException с использованием URLFetch для службы, которая отправляет сообщения канала

У нас есть два приложения AppEngine (Java). Один из них использует URLFetch для другого, чтобы создать встречу. В приемнике мы добавили функцию, в которой мы используем API канала, чтобы узнать, есть ли какие-либо открытые каналы, и сообщить им о новых данных.

Вызов URLFetch завершается с ошибкой SocketTimeoutException. Весь код в приемнике выполняется (включая уведомления всех открытых каналов), но вызывающее приложение по-прежнему получает исключение SocketTimeoutException. Когда я комментирую строку уведомления канала, ошибки нет.

Это происходит только в развернутом приложении, а не в режиме разработки. Кроме того, вызов не приближается к 60-секундному (или даже старому 10-секундному) тайм-ауту, разрешенному URLFetch.


person Kyle Baley    schedule 13.01.2012    source источник
comment
Мы не сможем помочь, не видя код и трассировку стека.   -  person Nick Johnson    schedule 13.01.2012
comment
Я бы собрал образец, но мы его обошли. Вместо того, чтобы уведомлять каналы напрямую, мы отправляем запрос в очередь задач. Эта очередь делает то же самое, но не возвращает исключение SocketTimeoutException. В любом случае оригинал был просто стандартным сервлетом с вызовом ChannelServiceFactory.getChannelService().sendMessage в конце.   -  person Kyle Baley    schedule 29.04.2012
comment
Это должно быть что-то конкретное для вашего приложения — это определенно не тот случай, когда невозможно сделать urfetch из одного приложения в другое!   -  person Nick Johnson    schedule 30.04.2012
comment
Согласованный. И делаем это регулярно. Ошибка возникает только в том случае, если мы делаем вызов API канала в принимающем приложении.   -  person Kyle Baley    schedule 30.04.2012


Ответы (1)


Крайний срок по умолчанию для urfetch — 5 секунд, поэтому, если вашему приложению требуется более 5 секунд для загрузки и выполнения обработчика, оно вернет SocketTimeoutException.

Как описано в документации, вы можете установить более длительный срок для ваш вызов urfetch с использованием setConnectTimeout или setReadTimeout

Кроме того, рекомендуется переместить вызов API, который можно отложить (т. е. не требуется для создания ответа http), в очередь задач:

  • крайний срок запроса очереди задач увеличен (10 минут вместо 60 с)
  • задача будет повторена в случае неудачи
  • Время ожидания urfetch тоже больше (10 минут)
person proppy    schedule 07.06.2012