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

StackOverflow https://stackoverflow.com/questions/48293

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

Видеть https://stackoverflow.fogbugz.com/default.asp?W13117

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

Мой подход всегда заключался в том, чтобы ОС (т.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 есть код, который поддерживает очередь задач, которые необходимо выполнить, смотрит, сколько времени прошло, и выполняет, знаете ли, ночное обслуживание и каждые семь дней удаляет все старые сообщения, которые были помечены как спам и все виды фоновых задач по обслуживанию.И вот как это делается.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top