Quartz-Java Web项目中使用Quartz
文章目錄
- 概述
- 實(shí)現(xiàn)
- 示例
- 步驟一 構(gòu)建Maven項(xiàng)目
- 步驟二 日志組件的配置logback.xml
- 步驟三 自定義監(jiān)聽器的編寫
- 步驟四 web.xml中注冊監(jiān)聽器
- 步驟五 啟動(dòng)
概述
Quartz也常用在Web應(yīng)用中,常見的是交由Spring托管的形式,但這里并非介紹這個(gè)。如果你的很老的一個(gè)項(xiàng)目沒有使用Spring呢? 這里我們介紹Quartz在Web應(yīng)用中單獨(dú)使用的場景。
實(shí)現(xiàn)
對于定時(shí)任務(wù)來講,一般來說,Web應(yīng)用啟動(dòng)時(shí),應(yīng)注冊已經(jīng)確定的定時(shí)任務(wù);一些動(dòng)態(tài)的、未確定觸發(fā)時(shí)間的定時(shí)任務(wù),后續(xù)可通過靜態(tài)的Scheduler注冊。
這里使用監(jiān)聽器在應(yīng)用啟動(dòng)時(shí)注冊,需要在web.xml注冊這個(gè)監(jiān)聽器,在關(guān)閉Web應(yīng)用時(shí),也要相應(yīng)的注銷定時(shí)任務(wù)。
示例
maven工程
步驟一 構(gòu)建Maven項(xiàng)目
pom.xml中添加依賴
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.artisan</groupId><artifactId>quartzInWeb</artifactId><packaging>war</packaging><version>0.0.1-SNAPSHOT</version><name>quartzInWeb Maven Webapp</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.3</version></dependency><!-- 日志組件slf4j xml的方式需增加 logback --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.21</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.21</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>1.1.7</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.1.7</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.1</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency></dependencies><build><finalName>quartzInWeb</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.7</source><target>1.7</target></configuration></plugin></plugins></build> </project>步驟二 日志組件的配置logback.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="true"><!-- 應(yīng)用名稱 --><property name="APP_NAME" value="logtest" /><!--日志文件的保存路徑,首先查找系統(tǒng)屬性-Dlog.dir,如果存在就使用其;否則,在當(dāng)前目錄下創(chuàng)建名為logs目錄做日志存放的目錄 --><property name="LOG_HOME" value="${log.dir:-logs}/${APP_NAME}" /><!-- 日志輸出格式 --><property name="ENCODER_PATTERN"value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80} - %msg%n" /><contextName>${APP_NAME}</contextName><!-- 控制臺(tái)日志:輸出全部日志到控制臺(tái) --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><Pattern>${ENCODER_PATTERN}</Pattern></encoder></appender><!-- 文件日志:輸出全部日志到文件 --><appender name="FILE"class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_HOME}/output.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>7</maxHistory></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${ENCODER_PATTERN}</pattern></encoder></appender><!-- 錯(cuò)誤日志:用于將錯(cuò)誤日志輸出到獨(dú)立文件 --><appender name="ERROR_FILE"class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_HOME}/error.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>7</maxHistory></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${ENCODER_PATTERN}</pattern></encoder><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>WARN</level></filter></appender><!-- 獨(dú)立輸出的同步日志 --><appender name="SYNC_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_HOME}/sync.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>7</maxHistory></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${ENCODER_PATTERN}</pattern></encoder></appender><logger name="log.sync" level="DEBUG" addtivity="true"><appender-ref ref="SYNC_FILE" /></logger><root><level value="DEBUG" /><appender-ref ref="STDOUT" /><appender-ref ref="FILE" /><appender-ref ref="ERROR_FILE" /></root> </configuration>步驟三 自定義監(jiān)聽器的編寫
package com.artisan.quartz;import static org.quartz.JobBuilder.newJob;import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener;import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SimpleScheduleBuilder; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class ApplicationContextListener implements ServletContextListener {private Logger logger = LoggerFactory.getLogger(ApplicationContextListener.class);public static Scheduler scheduler = null;public void contextInitialized(ServletContextEvent servletContextEvent) {logger.info("Web應(yīng)用開始...");/* 注冊定時(shí)任務(wù) */try {// 獲取Scheduler實(shí)例scheduler = StdSchedulerFactory.getDefaultScheduler();scheduler.start();// 具體任務(wù)JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build();// 觸發(fā)時(shí)間點(diǎn)SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever();Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startNow().withSchedule(simpleScheduleBuilder).build();// 交由Scheduler安排觸發(fā)scheduler.scheduleJob(job, trigger);logger.info("調(diào)度器開始注冊:The scheduler register...");} catch (SchedulerException se) {logger.error(se.getMessage(), se);}}public void contextDestroyed(ServletContextEvent sce) {logger.info("Web應(yīng)用停止...");/* 注銷定時(shí)任務(wù) */try {// 關(guān)閉Schedulerscheduler.shutdown();logger.info("調(diào)度器已關(guān)閉:The scheduler shutdown...");} catch (SchedulerException se) {logger.error(se.getMessage(), se);}}}假設(shè)我們有一個(gè)明確的任務(wù),在初始化監(jiān)聽器的時(shí)候就啟動(dòng)執(zhí)行,如下
package com.artisan.quartz;import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class HelloJob implements Job {private Logger logger = LoggerFactory.getLogger(HelloJob.class);@Overridepublic void execute(JobExecutionContext context)throws JobExecutionException {System.out.println("Hello Job");// 此任務(wù)僅打印日志便于調(diào)試、觀察System.out.println(this.getClass().getSimpleName() + " trigger...");logger.debug(this.getClass().getSimpleName() + " trigger...");}}步驟四 web.xml中注冊監(jiān)聽器
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><!-- 加入自定義監(jiān)聽器 --><listener><listener-class>com.artisan.quartz.ApplicationContextListener</listener-class></listener></web-app>步驟五 啟動(dòng)
由于我們使用的JDK1.7 ,我們用的tomcat,這里tomcat的版本需要為8.0
關(guān)鍵日志如下:
如果我們Eclipse或者Spring tool suit中調(diào)試,無法看到contextDestroyed方法的執(zhí)行。
SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever();repeatForever()方法,這個(gè)方法的意思表示永遠(yuǎn)執(zhí)行,當(dāng)然我們也可以自定義重復(fù)執(zhí)行的次數(shù),使用withRepeatCount(10)方法,10表示執(zhí)行了10次
總結(jié)
以上是生活随笔為你收集整理的Quartz-Java Web项目中使用Quartz的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Quartz-任务调度信息持久化到DB中
- 下一篇: Java was started but