Я иногда выручаю пользователей на форумах Quartz Scheduler. Время от времени кто-то спрашивает, как он / она может настроить Quartz внутри веб-приложения. Это на самом деле довольно простая вещь. Библиотека уже поставляется с ServletContextListener
который вы можете использовать для запуска планировщика. Я покажу вам простой пример веб-приложения здесь.
Сначала создайте файл Maven pom.xml
.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<?xml version= "1.0" encoding= "UTF-8" ?> <project xmlns= "http://maven.apache.org/POM/4.0.0" xsi:schemaLocation= <modelVersion> 4.0 . 0 </modelVersion> <groupId>quartz-web-demo</groupId> <artifactId>quartz-web-demo</artifactId> <packaging>war</packaging> <version> 1.0 -SANPSHOT</version> <dependencies> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version> 2.2 . 0 </version> </dependency> </dependencies> </project> |
Затем вам нужно создать файл src/main/webapp/META-INF/web.xml
.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
<?xml version= "1.0" encoding= "UTF-8" ?> <web-app version= "2.5" xsi:schemaLocation= <context-param> <param-name>quartz:config-file</param-name> <param-value>quartz.properties</param-value> </context-param> <context-param> <param-name>quartz:shutdown-on-unload</param-name> <param-value> true </param-value> </context-param> <context-param> <param-name>quartz:wait-on-shutdown</param-name> <param-value> true </param-value> </context-param> <context-param> <param-name>quartz:start-on-load</param-name> <param-value> true </param-value> </context-param> <listener> <listener- class >org.quartz.ee.servlet.QuartzInitializerListener</listener- class > </listener> </web-app> |
И, наконец, вам нужен конфигурационный файл src/main/resources/quartz.properties
для планировщика.
1
2
3
4
5
6
|
# Main Quartz configuration org.quartz.scheduler.skipUpdateCheck = true org.quartz.scheduler.instanceName = MyQuartzScheduler org.quartz.scheduler.jobFactory. class = org.quartz.simpl.SimpleJobFactory org.quartz.threadPool. class = org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount = 5 |
Вы можете настроить много других вещей с помощью Quartz, но вышеприведенное должно помочь вам начать работу с планировщиком In-Memory.
Теперь вы должны быть в состоянии скомпилировать и запустить его.
1
2
|
bash> mvn compile bash> mvn org.apache.tomcat.maven:tomcat7-maven-plugin: 2.1 :run -Dmaven.tomcat.port= 8081 |
Как настроить ведение журнала для Quartz Scheduler
Другой часто задаваемый вопрос — как настроить регистрацию и посмотреть сообщения уровня DEBUG. Кварцевые планировщики используют SLF4J, поэтому у вас есть много вариантов для ведения журнала. Я покажу вам, как настроить Log4j, например, ниже.
Сначала добавьте это в ваш pom.xml
1
2
3
4
5
|
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version> 1.7 . 5 </version> </dependency> |
Затем добавьте файл src/main/resources/log4j.properties
для отображения сообщений на STDOUT.
1
2
3
4
5
|
log4j.rootLogger=INFO, stdout log4j.logger.org.quartz=DEBUG log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n |
Перезапустите веб-приложение в командной строке, и теперь вы должны увидеть все сообщения журнала уровня DEBUG, поступающие из библиотеки Quartz.
Когда все работает, следующим вопросом может быть вопрос, как получить доступ к планировщику из веб-приложения? Хорошо, когда планировщик создается слушателем контекста сервлета, он сохраняется в пространстве ServletContext веб-приложения с ключом org.quartz.impl.StdSchedulerFactory.KEY
. Таким образом, вы можете получить его и использовать в своем собственном сервлете следующим образом:
1
2
3
4
5
6
7
8
9
|
public class YourServlet extends HttpServlet { public init(ServletConfig cfg) { String key = "org.quartz.impl.StdSchedulerFactory.KEY" ; ServletContext servletContext = cfg.getServletContext(); StdSchedulerFactory factory = (StdSchedulerFactory) servletContext.getAttribute(key); Scheduler quartzScheduler = factory.getScheduler( "MyQuartzScheduler" ); // TODO use quartzScheduler here. } } |
Теперь вы на пути к созданию следующего приложения для планирования!
Повеселись!