Quartz-Java Web项目中使用Quartz
生活随笔
收集整理的這篇文章主要介紹了
Quartz-Java Web项目中使用Quartz
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 概述
- 實現(xiàn)
- 示例
- 步驟一 構(gòu)建Maven項目
- 步驟二 日志組件的配置logback.xml
- 步驟三 自定義監(jiān)聽器的編寫
- 步驟四 web.xml中注冊監(jiān)聽器
- 步驟五 啟動
概述
Quartz也常用在Web應用中,常見的是交由Spring托管的形式,但這里并非介紹這個。如果你的很老的一個項目沒有使用Spring呢? 這里我們介紹Quartz在Web應用中單獨使用的場景。
實現(xiàn)
對于定時任務來講,一般來說,Web應用啟動時,應注冊已經(jīng)確定的定時任務;一些動態(tài)的、未確定觸發(fā)時間的定時任務,后續(xù)可通過靜態(tài)的Scheduler注冊。
這里使用監(jiān)聽器在應用啟動時注冊,需要在web.xml注冊這個監(jiān)聽器,在關(guān)閉Web應用時,也要相應的注銷定時任務。
示例
maven工程
步驟一 構(gòu)建Maven項目
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"><!-- 應用名稱 --><property name="APP_NAME" value="logtest" /><!--日志文件的保存路徑,首先查找系統(tǒng)屬性-Dlog.dir,如果存在就使用其;否則,在當前目錄下創(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><!-- 控制臺日志:輸出全部日志到控制臺 --><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><!-- 錯誤日志:用于將錯誤日志輸出到獨立文件 --><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><!-- 獨立輸出的同步日志 --><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應用開始...");/* 注冊定時任務 */try {// 獲取Scheduler實例scheduler = StdSchedulerFactory.getDefaultScheduler();scheduler.start();// 具體任務JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build();// 觸發(fā)時間點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應用停止...");/* 注銷定時任務 */try {// 關(guān)閉Schedulerscheduler.shutdown();logger.info("調(diào)度器已關(guān)閉:The scheduler shutdown...");} catch (SchedulerException se) {logger.error(se.getMessage(), se);}}}假設我們有一個明確的任務,在初始化監(jiān)聽器的時候就啟動執(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");// 此任務僅打印日志便于調(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>步驟五 啟動
由于我們使用的JDK1.7 ,我們用的tomcat,這里tomcat的版本需要為8.0
關(guān)鍵日志如下:
如果我們Eclipse或者Spring tool suit中調(diào)試,無法看到contextDestroyed方法的執(zhí)行。
SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever();repeatForever()方法,這個方法的意思表示永遠執(zhí)行,當然我們也可以自定義重復執(zhí)行的次數(shù),使用withRepeatCount(10)方法,10表示執(zhí)行了10次
總結(jié)
以上是生活随笔為你收集整理的Quartz-Java Web项目中使用Quartz的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Quartz-任务调度信息持久化到DB中
- 下一篇: Quartz-Spring集成Quart