Периодически вызывайте функцию в Java - PullRequest
6 голосов
/ 18 ноября 2009

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

Ответы [ 8 ]

10 голосов
/ 18 ноября 2009

Чтобы периодически что-то вызывать, см. TimerTask

5 голосов
/ 18 ноября 2009

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

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

4 голосов
/ 18 ноября 2009

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

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

2 голосов
/ 04 ноября 2010

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

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

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

2 голосов
/ 18 ноября 2009

Не забывайте о java.util.concurrent - в нем много классов для планирования, например, ScheduledThreadPoolExecutor, если вам нужно больше, чем простой таймер.

http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html

Существует также обратный порт для Java 1.4: http://backport -jsr166.sourceforge.net .

2 голосов
/ 18 ноября 2009

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

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

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

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

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

(3) и запустить некоторые потоки, чтобы проверить системные условия, которые доступны для Java, даже запустить системные проги (время работы и т. Д.) И проанализировать вывод.

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

2 голосов
/ 18 ноября 2009

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

1 голос
/ 18 ноября 2009

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

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

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

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

...