3

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

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

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

+0

Мы не можем помочь, не видя код и стек. –

+0

Я собрал образец, но мы работали вокруг него. Вместо того, чтобы напрямую уведомлять каналы, мы отправляем запрос в очередь задач. Эта очередь делает то же самое, но не возвращает исключение SocketTimeoutException. В любом случае оригинал был просто стандартным сервлетом с вызовом ChannelServiceFactory.getChannelService() .sendMessage в конце. –

+0

Это должно быть что-то конкретное для вашего приложения - это определенно не тот случай, когда невозможно сделать urlfetch из одного приложения в другое! –

ответ

0

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

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

Кроме того, это хорошая идея, чтобы переместить апи вызов, который может быть отложено (т.е. не нужных построить ответ HTTP) на task queue:

  • крайний срок для запроса очереди задач больше (10 минут, вместо 60-е годы)
  • задача будет повторена, если не суметь
  • тайм-аут urlfetch длиннее (10 минут)
Смежные вопросы