2012-12-05 2 views
1

Я занимался некоторыми исследованиями об отмене аякс-запросов, и я прочитал несколько тем здесь об этой теме. Я нашел это очень информативную тему:Остановить запросы ajax на стороне сервера

Abort Ajax requests using jQuery

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

ps: тайм-ауты по запросу мне не помогут. Я использую JSF для вызова bean-компонента, который вызывает алгоритм оптимизации, и я хотел бы, по возможности, остановить алгоритм по требованию.

+2

Какая серверная технология вы используете? –

+0

Я использую Glassfish. Я также забыл упомянуть, что я также использую JSF. – Tinadm

ответ

0

Чтобы это произошло надежно, вам необходимо сделать код с тяжелыми вычислениями, как долго выполняемая задача, которая обрабатывается в фоновом режиме. Затем ваш запрос будет запускать задачу с привязкой к сеансу пользователя. Чтобы отменить выполнение, потребуется другой запрос. Это можно сделать с помощью таймера на стороне клиента после того, как инициирующий запрос вернется, если он произойдет через заданный период времени или может быть инициирован пользователем с помощью кнопки или любого другого.

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

+0

Это хорошая идея. Я попытаюсь сделать первый запрос просто создать новый поток и начать вычисления. Второй запрос, как вы сказали, может быть вызван кнопкой или любым другим, установив флаг, чтобы остановить поток. Как только я закончу, я публикую здесь результаты. – Tinadm

+0

Кажется, что создание другой задачи для выполнения вычислений, как я сказал в предыдущих комментариях, работает. Но я столкнулся с другой проблемой: если пользователь не отменяет задачу и заканчивает ее правильно, как я могу заставить ее уведомлять мое приложение о том, что оно закончилось, так как мой экземпляр FacesContext больше не действителен? Я имею в виду, как я могу связать свою задачу с сеансом пользователя, как вы предложили? – Tinadm

+0

Это совсем другой проект вообще ... мы являемся магазином .net, но мы используем порт C# [Quartz] (http://quartz-scheduler.org/), чтобы программно планировать длительные задачи и хранить прогессию info в базе данных, если это необходимо. В конечном итоге вы получите три конечных точки: один для запуска задачи, другой для контроля выполнения указанной задачи, а третий - для необязательной отмены задачи. Это не «легкое» решение, но я нашел практически все проекты веб-приложений, которые я начал, способность запускать многолетние фоновые задачи имеет далеко идущие преимущества. –

Смежные вопросы