2009-11-18 3 views
5

нам нужно периодически запускать одну функцию в веб-приложении Java. Как периодически вызывать функцию некоторого класса? Есть ли способ, который вызывает функцию, когда какое-то событие происходило как высокая загрузка на сервере и так далее. что такое кронтаб? Это работает периодически?Функция вызова периодически в Java

ответ

5

Если вам нужно что-то более надежное вы можете использовать Quartz

Что касается crontab является инструментом планирования на машинах Unix.

+0

Более надежный, чем TimerTask? Это просто более гибко. – BalusC

+0

@BalusC: Надежный был бы с Quartz, вы можете планировать различные объекты, вы можете использовать транзакции JTA, кластеризацию и многие другие функции Java EE. – OscarRyz

+0

@Brian. Ну да, тогда это зависит от вашей концепции надежности. Одной из дополнительных функций Quartz является постоянство между перезапусками системы. Это только будущее, да, но это будущее, которое добавит устойчивости к библиотеке в любом случае, по крайней мере, с моей точки зрения. – OscarRyz

2

Если вы хотите что-то периодически запускать, не делайте этого на веб-сервере. Это был бы очень неправильный подход ИМО. Лучше использовать cron, если вы работаете в Unix-подобной операционной системе. Серверы Windows предлагают аналогичную функциональность.

+0

Java Web App вполне может работать на сервере приложений JEE. Если периодическое действие, которое вы хотите вызвать Business Logic, реализованное в JEE, то использование ошибок JEE Timer вполне разумно и полностью поддерживается. – djna

+0

Возможно, вы могли бы объяснить, почему это плохой подход, чтобы поместить его в веб-сервер против использования чего-то вроде cron? – chrisbunney

+0

djna: Согласен. Требуется дополнительная информация. –

4

Для вызова методов, когда сервер имеет большую нагрузку, у вас есть как минимум два возможных подхода. У вашего сервера приложений могут быть крючки управления, которые позволяют контролировать его поведение и предпринимать прогромматические действия. Альтернативно у вас есть возможность мониторинга системы (например, Tivoli или OpenView), и она генерирует «события», не должно быть слишком сложно доставлять такие события, как (например) JMS-сообщения, и ваш сервер забирает их.

Однако, возможно, вам захочется объяснить немного больше о том, чего вы хотите достичь. Адаптивное приложение beahviour может быть довольно сложным, чтобы получить право.

1

Как вызвать функцию некоторого класса периодически?

Есть несколько решений: а Timer, реализация хрон Java как cron4j, Quartz или даже EJB Timer API. Выбор одного или другого сильно зависит от контекста: тип приложения, используемые технологии, количество заданий и т. Д.

Есть ли способ вызова, когда происходит какое-либо событие, например, высокая загрузка на сервере и так и на

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

2

нам нужно запустить одну функцию периодически в веб-приложения Java

(1) Так что смотрите в дескрипторе развертывания (web.xml) определяют слушателя для запуска во время запуска.

Как позвонить функции некоторого класса ?

(2) Создайте Timer в слушателе.

Есть ли способ, который вызывает функцию , когда какое-то событие произошло, как высокие нагрузки сервер и так далее

(3) и запустить Темы для проверки состояния системы, которые подъезд с Java , даже запускать системные проги (время простоя и т. д.) и анализировать выходные данные.

crontab может быть способом, но выполнение Java запустит другую JVM, и это действительно горячая вещь в контейнерах сервлетов: все работает в одной JVM.

2

Если вы уже используете Spring, вы можете взглянуть на структуру выполнения задач Spring - используя @Scheduled и @Async для аннотирования методов в качестве задач и реализации функциональности в Процессоре, который делегирует фактическую работу Работнику, как описано в:

http://blog.springsource.com/2010/01/05/task-scheduling-simplifications-in-spring-3-0/

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

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