Обработка тайм-аута на стороне клиента с помощью веб-службы Sinatra - PullRequest
2 голосов
/ 03 октября 2011

Я начинающий с Руби и Синатры, но сумел придумать веб-сервис, который работает очень хорошо, работает на Heroku. Я получаю доступ к этому веб-сервису с Salesforce.com.

Максимальный интервал ожидания для класса HTTPRequest, который я использую в Salesforce / Apex, составляет 60 с. Если у меня истечет этот тайм-аут (или, когда у меня будет 1-секундный тайм-аут, который я использую для целей тестирования), я получу исключение со стороны Salesforce, с которым я легко справлюсь. Меня интересует, как справиться с этим на стороне Синатры.

Если мой клиент получает тайм-аут и каким-то образом закрывает соединение, есть ли способ «почувствовать» это в моем приложении Sintra? Я хотел бы отметить время ожидания клиента, продолжить выполнение работы, которую запустило приложение, а затем отправить электронное письмо, чтобы сообщить пользователю, что задание завершено после истечения времени ожидания.

Я должен заметить, что когда я получу тайм-аут сейчас, приложение Sinatra с радостью завершит то, что оно делало, и, я предполагаю, возвращает данные JSON, которые оно должно было. Только на стороне клиента нет ничего, чтобы получить эти данные.

Есть мысли?

1 Ответ

0 голосов
/ 08 октября 2011

Забавная проблема.Как протокол без сохранения состояния, я не верю, что HTTP включает метод «распознавания», когда клиент закрывает соединение.Я действительно ничего не знаю о том, что делает SalesForce, но вот некоторые стандартные решения HTTP (я предполагаю, что веб-сокеты отсутствуют).

Самый простой, но склонный к ложным срабатываниям

Поскольку вы знаете максимальный тайм-аут, время вашего запроса Синатра.Если это заняло более 60 секунд, предположите, что время истекло, и отправьте электронное письмо.Очевидно, что это может привести к ошибкам где-то около 59-61 секунд, и вы можете получить некоторые ложные срабатывания и ложные отрицания.

Сложнее, но склонны к совершенству

Вы можетереализовать «чек квитанции».Ваш ответ JSON будет содержать UID.Если ваш запрос SalesForce не тайм-аут, отправьте UID обратно в качестве квитанции.Тогда Sinatra будет знать, что все в порядке.

Если приложение Sinatra не получит квитанцию ​​в течение n секунд / минут (потому что у SalesForce истекло время ожидания, и вы никогда не получили UID), приложение Sinatra может отправить электронное письмоили что угодно) через n секунд / минут.

Это может быть реализовано несколькими способами.Самое простое, вероятно, включает в себя базу данных, скрипт и cron.Самое сложное, вероятно, связано с потоковой передачей HTTP (сейчас это тривиально в Sinatra 1.3) и, возможно, многопоточными или четными серверами, такими как Thin или Zbattery.Я был бы рад разработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...