Статьи

Как создать веб-приложение с Quartz Scheduler и логированием

Я иногда выручаю пользователей на форумах 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"?>
    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.
    }
}

Теперь вы на пути к созданию следующего приложения для планирования!

Повеселись!