2012-01-05 3 views
1

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

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

ответ

7

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

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

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

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

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

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

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

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

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

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

Cascaded Callbacks

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

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

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

Там на самом деле то, что может быть отменено на стороне клиента - сам запрос http. Если сервер каким-то образом застрял (следующий вызов не может отменить предыдущий), соединение может оставаться открытым, и, в зависимости от браузера, у вас может закончиться соединение. Или загружается изображение, поэтому второй запрос RPC не может быть выполнен. Как оказалось, можно убить http-соединение, но это не означает, что сервер остановится, просто освободите транспорт. Для этого верните 'com.google.gwt.http.client.Request' из вашего метода интерфейса async вместо void и отмените вызов. –