Запуск обычного фонового события в веб-приложении Java - PullRequest
8 голосов
/ 07 сентября 2008

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

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

Как Джефф сделал это в Asp.Net и применим ли его метод к миру веб-приложений на Java?

Ответы [ 5 ]

12 голосов
/ 07 сентября 2008

Я думаю, что разработка собственного решения для выполнения фоновых задач не всегда стоит, поэтому я рекомендую использовать Quartz Scheduler в Java.

В вашей ситуации (необходимо запускать фоновые задачи в веб-приложении) вы можете использовать ServletContextListener, включенный в дистрибутив, для инициализации движка при запуске веб-контейнера .

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

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

5 голосов
/ 07 сентября 2008

Как уже упоминалось, кварц является одним из стандартных решений. Если вас не волнует кластеризация или сохранение фоновых задач при перезапуске, вы можете использовать встроенную поддержку ThreadPool (в Java 5,6). Если вы используете ScheduledExecutorService , вы можете поместить Runnables в фоновый пул потоков, которые ждут определенное время перед выполнением.

Если вы заботитесь о кластеризации и / или сохранении, вы можете использовать очереди JMS для асинхронного выполнения, хотя вам все равно потребуется какой-то способ задержки фоновых задач (для этого можно использовать Quartz или ScheduledExecutorService).

3 голосов
/ 07 сентября 2008

Механизм Джеффа состоял в том, чтобы создать какой-то кешированный объект, который ASP.Net автоматически воссоздает через некоторый промежуток времени. Казалось, что это решение для ASP.Net, поэтому, вероятно, вам (или мне) мало что поможет Мир Java.

См. https://stackoverflow.fogbugz.com/default.asp?W13117

Этвуд: Ну, я изначально спросил в Твиттере, потому что я просто хотел что-то более легкое. Я действительно не хотел писать сервис Windows. Я чувствовал, что это было вне группового кода. Плюс код, который фактически выполняет эту работу, на самом деле является веб-страницей, потому что для меня это логическая единица работы на веб-сайте - это веб-страница. Итак, это действительно так, как будто мы перезваниваем на веб-сайт, это как очередной запрос на веб-сайте, так что я рассматривал его как нечто, что должно оставаться встроенным, и тот небольшой подход, который мы предложили, который был рекомендован мне в Twitter По сути, нужно было что-то добавить в кеш приложения с фиксированным сроком действия, затем у вас есть обратный вызов, поэтому, когда он истекает, он вызывает определенную функцию, которая выполняет свою работу, а затем вы добавляете это обратно в кеш с тем же сроком действия. Так что это немного, может быть, «гетто» - правильное слово.

Мой подход всегда заключался в том, чтобы ОС (т. Е. Cron или планировщик задач Windows) загружала определенный URL-адрес через некоторый интервал, а затем настраивала страницу по этому URL-адресу, чтобы проверить ее очередь и выполнить все необходимые задачи, но Мне было бы интересно узнать, есть ли лучший способ.

Из стенограммы видно, что FogBugz использует службу Windows, также загружающую подход с использованием URL.

Спольский: Итак, у нас есть специальная страница, которая называется heartbeat.asp. И эта страница, когда бы вы ни нажали ее, и любой может ее открыть в любое время: не повредит. Но когда эта страница запускается, она проверяет очередь ожидающих задач, чтобы увидеть, нужно ли что-то делать. И если есть что-то, что нужно сделать, он делает одно, а затем снова просматривает эту очередь, и если что-то еще нужно сделать, он возвращает плюс, а вся возвращаемая веб-страница представляет собой просто один символ с плюсом. в этом. И если больше ничего не нужно делать, очередь теперь пуста, она возвращает минус. Таким образом, любой может вызвать это и нажать его столько раз, вы можете загрузить heartbeat.asp в своем веб-браузере, нажимая Ctrl-R Ctrl-R Ctrl-R Ctrl-R, пока не начнете получать минусы вместо плюсов. И когда вы это сделаете, FogBugz выполнит все необходимые работы по обслуживанию. Итак, это первая часть, а вторая - очень, очень простая служба Windows, которая запускается, и вся ее задача - вызывать heartbeat.asp, и если он получает плюс, вызовите его снова в ближайшее время, и если он получит вызов минус это снова, но не на некоторое время. Так что, по сути, есть эта служба Windows, которая всегда работает, которая имеет очень, очень, очень простую задачу: просто нажать на URL, посмотреть, получит ли он плюс или минус и, а затем составить расписание при повторном запуске в зависимости от того, у него есть плюс или минус. И, очевидно, вы можете делать любые вариации на эту тему, например, вы можете вместо того, чтобы возвращать только плюс или минус, вы можете сказать: «Хорошо, перезвони мне через 60 секунд» или «Перезвони мне прямо». прочь у меня еще много работы. " И вот как это работает ... так что сервисное обслуживание просто запускается, вы знаете, это как, вы знаете, половина страницы кода, который выполняет сервисное обслуживание, и его никогда не нужно менять, и у него нет никакого логики там, это просто содержит щекотку, которая заставляет эти веб-страницы вызываться с определенной гарантированной частотой. И внутри этой веб-страницы в heartbeat.asp есть код, который поддерживает очередь задач, которые необходимо выполнить, и смотрит, сколько времени прошло, и выполняет, вы знаете, ночное обслуживание и каждые семь дней удаляет все старые сообщения, которые были помечены как спам и все виды просто фоновые задачи обслуживания. И вот как это происходит.

2 голосов
/ 07 сентября 2008

Мы используем jtcron для наших запланированных фоновых задач. Это хорошо работает, и если вы понимаете cron, это должно иметь для вас смысл.

1 голос
/ 07 сентября 2008

Вот как они это делают на StackOverflow.com:

http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

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