Калитка: как справляться с длительными задачами - PullRequest
6 голосов
/ 22 февраля 2010

Я установил веб-приложение Wicket + Hibernate + Spring, которое включает сбор некоторых данных (создание и возврат некоторых файлов), сохранение их в базе данных, создание некоторых изображений и отображение всего этого на веб-странице.

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

Первым подходом было использование AjaxLazyLoadPanel s и просто выполнение всего внутри getLazyLoadComponent. Это работало нормально для коротких запусков, но для более чем 20-минутных запусков LazyLoadComponents не загружался (хороший оксюморон там) из-за тайм-аутов.

Второй подход заключался в создании промежуточного фрагмента с добавленным AjaxSelfUpdatingTimerBehavior с продолжительностью, установленной в 10 секунд, который опрашивал файлы, создаваемые при обработке числа. Похоже, что из-за этого задачи выполняются в фоновом режиме без проблем, но происходит сбой, когда возвращаемые данные необходимо сохранить в базе данных. Я использую шаблон Open Session in View, но, возможно, это не удается при попытке сохранить данные через 20 минут ?? (Решение может заключаться в решении этого ..).

Из-за вышеуказанных проблем я сейчас читаю альтернативные подходы для решения этих длительных задач и наткнулся на:

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

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

С уважением,
Тим

1 Ответ

3 голосов
/ 22 февраля 2010

Я знаю, что мы успешно использовали Panel с прикрепленным AjaxSelfUpdatingTimerBehavior. Задача и часть результатов отделены от логики представления, но становятся доступными для представления через созданную вами службу. Реализация сервиса, которую мы использовали, отвечает за запуск TheadPool или ExectutorService для выполнения отдельных задач. Служба может предоставить способ контроля за ходом / состоянием конкретной работы / вызова, который происходит. Как только он будет завершен, он также должен сделать данные доступными для просмотра. Внедрение SessionFactory в реализацию службы (или DAO) должно быть достаточным для создания HibernateSession вне WebSession.

...