Отмена вызова gwt rpc - PullRequest
       8

Отмена вызова gwt rpc

1 голос
/ 06 января 2012

В этом примере есть симпатичное описание того, как сделать логику тайм-аута, используя Timer#schedule.Но здесь есть подводный камень.У нас есть 2 запроса rpc: первый выполняет много вычислений на сервере (или, возможно, извлекает большой объем данных из базы данных), а второй - крошечный запрос, который немедленно возвращает результаты.Если мы сделаем первый запрос, мы не получим результаты немедленно, вместо этого у нас будет тайм-аут, и после тайм-аута мы сделаем второй крошечный запрос, и тогда abortFlag из примера будет истинным, поэтому мы можем получить результаты второго запроса, нотакже мы можем получить результаты первого запроса, который был превышен по тайм-ауту ранее (поскольку объект AsyncCallback первого вызова не был уничтожен).

Таким образом, нам нужно отменить первый вызов rpc после истечения времени ожидания.как я могу это сделать?

1 Ответ

7 голосов
/ 06 января 2012

Позвольте привести аналогию.

Вы, начальник, позвонили поставщику, чтобы получить информацию о продукте. Поставщики говорят, что им нужно перезвонить вам, потому что сбор информации займет некоторое время. Итак, вы дали им контакт вашего бригадира.

Ваш бригадир ждет звонка. Затем вы сказали своему мастеру отменить информационный запрос, если это займет более 30 минут.

Ваш мастер думает, что вы помешаны, потому что он не может отменить запрос, потому что у него нет учетной записи, которая дает ему право доступа к системе заказов поставщика.

Итак, ваш мастер просто игнорирует любой ответ поставщика через 30 минут. Ваш гениальный мастер устанавливает в своем телефоне таймер, который игнорирует звонок от поставщика через 30 минут. Даже если вы убьете своего бригадира, отключите все каналы связи, продавец все равно будет занят обслуживанием вашего запроса.

Нет ничего на стороне клиента GWT, чтобы отменить. Обратный вызов - это просто объект javascript, ожидающий вызова.

Чтобы отменить вызов, необходимо указать стороне сервера прекратить тратить ресурсы процессора (если это ваша проблема). Ваша серверная сторона должна быть запрограммирована на предоставление сервисного API, который при вызове отменял бы задание и немедленно возвращался, чтобы вызвать ваш обратный вызов GWT.

Вы можете обновить страницу, и это отменит запрос страницы и закроет сокет, но сторона сервера все еще будет работать. И когда серверная часть завершает свои задачи и пытается выполнить http-ответ, он завершится неудачно, сообщив в журналах сервера, что потерял клиентский сокет.

Это очень прямолинейный аргумент.

Следовательно, в дизайн вашего сервлета / службы входит то, как предыдущий запрос может быть идентифицирован последующим запросом.

Каскадные обратные вызовы

Если запрос 2 зависит от состояния запроса 1, вам следует выполнить каскадный обратный вызов. Если запрос 2 должен быть выполнен успешно, вы должны поместить запрос 2 в блок onFailure обратного вызова. Вместо того, чтобы отправлять два запроса один за другим.

В противном случае ваш таймер должен вызвать запрос 2, а запрос 2 будет иметь две обязанности:

  • попросить сервер отменить предыдущий запрос
  • получить маленький кусочек информации
...