只要配置:
1. 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.company.app</groupId> <artifactId>my-maven-demo-jetty</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>my-maven-demo-jetty Maven Webapp</name> <url>http://maven.apache.org</url> <!-- properties --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <springversion>3.2.0.RELEASE</springversion> <junitversion>3.8.1</junitversion> <quartz.version>2.2.1</quartz.version> </properties> <!-- jar --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>${springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>${springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> <type>jar</type> <scope>compile</scope> </dependency> <!-- commons --> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.1</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1</version> </dependency> <!-- quartz --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>${quartz.version}</version> </dependency> </dependencies> <!-- plugin --> <build> <finalName>my-maven-demo-jetty</finalName> <plugins> <!-- Maven Jetty Plugin --> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.10</version> <configuration> <!-- 端口号 --> <connectors> <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"> <port>8081</port> </connector> </connectors> <!-- 每5秒的间隔扫描一次,实现热部署 --> <scanIntervalSeconds>5</scanIntervalSeconds> </configuration> </plugin> <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>
2. Spring MVC 配置Bean工厂的xml,pring-mvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> <!-- 自动注册基于注解风格的处理器需要的DefaultAnnotationHandlerMapping、AnnotationMethodHandlerAdapter --> <mvc:annotation-driven /> <context:component-scan base-package="com.demo" /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/" /> <property name="suffix" value=".jsp" /> </bean> <!-- 实现定时器的关键在下面========================================================================== --> <!-- 使用MethodInvokingJobDetailFactoryBean,任务类可以不实现Job接口,通过targetMethod指定调用方法 --> <bean id="taskJob" class="com.demo.scheduler.HouseKeep" /> <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="group" value="job_work" /> <property name="name" value="job_work_name" /> <!--false表示等上一个任务执行完后再开启新的任务 --> <property name="concurrent" value="false" /> <property name="targetObject"> <ref bean="taskJob" /> </property> <property name="targetMethod"> <value>run</value> </property> </bean> <!-- 调度触发器 --> <bean id="houskeepTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="name" value="work_default_name" /> <property name="group" value="work_default" /> <property name="jobDetail"> <ref bean="jobDetail" /> </property> <property name="cronExpression"> <value>0/5 * * * * ?</value> </property> </bean> <!-- 调度工厂 --> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="houskeepTrigger" /> </list> </property> </bean> </beans>
3. web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- Spring的log4j监听器 --> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <!-- 核心控制器 --> <servlet> <servlet-name>spring-mvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 修改自定义加载文件 <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-mvc-servlet.xml</param-value> </init-param> --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring-mvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- SpringMVC.start --> <!-- <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> --> <!-- Request UTF-8 support 解决POST时,中文乱码 --> <filter> <filter-name>Spring character encoding filter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>Spring character encoding filter</filter-name> <url-pattern>/</url-pattern> </filter-mapping> <!-- 浏览器不支持put,delete等method,由该filter将/blog?_method=delete转换为标准的http delete方法 --> <filter> <filter-name>hiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>hiddenHttpMethodFilter</filter-name> <servlet-name>spring-mvc</servlet-name> </filter-mapping> </web-app>
4. 调度类,HouseKeep
package com.demo.scheduler; public class HouseKeep { public HouseKeep() { System.out.println("HouseKeep构造函数"); } public void run() { System.out.println("定时调度"); } }
下面是重点:
如果需要动态修改调度,如停止调度,修改调度cron,需要加调度类
SchedulerService
package com.demo.service; import java.util.Date; import org.quartz.CronExpression; public interface SchedulerService { /** * 根据 Quartz Cron Expression 调试任务 * * @param cronExpression * Quartz Cron 表达式,如 "0/10 * * ? * * *"等 */ void schedule(String cronExpression); /** * 根据 Quartz Cron Expression 调试任务 * * @param name * Quartz CronTrigger名称 * @param cronExpression * Quartz Cron 表达式,如 "0/10 * * ? * * *"等 */ void schedule(String name, String cronExpression); /** * 根据 Quartz Cron Expression 调试任务 * * @param name * Quartz CronTrigger名称 * @param group * Quartz CronTrigger组 * @param cronExpression * Quartz Cron 表达式,如 "0/10 * * ? * * *"等 */ void schedule(String name, String group, String cronExpression); /** * 根据 Quartz Cron Expression 调试任务 * * @param cronExpression * Quartz CronExpression */ void schedule(CronExpression cronExpression); /** * 根据 Quartz Cron Expression 调试任务 * * @param name * Quartz CronTrigger名称 * @param cronExpression * Quartz CronExpression */ void schedule(String name, CronExpression cronExpression); /** * 根据 Quartz Cron Expression 调试任务 * * @param name * Quartz CronTrigger名称 * @param group * Quartz CronTrigger组 * @param cronExpression * Quartz CronExpression */ void schedule(String name, String group, CronExpression cronExpression); /** * 在startTime时执行调试一次 * * @param startTime * 调度开始时间 */ void schedule(Date startTime); void schedule(Date startTime, String group); /** * 在startTime时执行调试一次 * * @param name * Quartz SimpleTrigger 名称 * @param startTime * 调度开始时间 */ void schedule(String name, Date startTime); void schedule(String name, Date startTime, String group); /** * 在startTime时执行调试,endTime结束执行调度 * * @param startTime * 调度开始时间 * @param endTime * 调度结束时间 */ void schedule(Date startTime, Date endTime); void schedule(Date startTime, Date endTime, String group); /** * 在startTime时执行调试,endTime结束执行调度 * * @param name * Quartz SimpleTrigger 名称 * @param startTime * 调度开始时间 * @param endTime * 调度结束时间 */ void schedule(String name, Date startTime, Date endTime); void schedule(String name, Date startTime, Date endTime, String group); /** * 在startTime时执行调试,endTime结束执行调度,重复执行repeatCount次 * * @param startTime * 调度开始时间 * @param repeatCount * 重复执行次数 */ void schedule(Date startTime, int repeatCount); /** * 在startTime时执行调试,endTime结束执行调度,重复执行repeatCount次 * * @param startTime * 调度开始时间 * @param endTime * 调度结束时间 * @param repeatCount * 重复执行次数 */ void schedule(Date startTime, Date endTime, int repeatCount); void schedule(Date startTime, Date endTime, int repeatCount, String group); /** * 在startTime时执行调试,endTime结束执行调度,重复执行repeatCount次 * * @param name * Quartz SimpleTrigger 名称 * @param startTime * 调度开始时间 * @param endTime * 调度结束时间 * @param repeatCount * 重复执行次数 */ void schedule(String name, Date startTime, Date endTime, int repeatCount); void schedule(String name, Date startTime, Date endTime, int repeatCount, String group); /** * 在startTime时执行调试,endTime结束执行调度,重复执行repeatCount次,每隔repeatInterval秒执行一次 * * @param startTime * 调度开始时间 * * @param repeatCount * 重复执行次数 * @param repeatInterval * 执行时间隔间 */ void schedule(Date startTime, int repeatCount, long repeatInterval); /** * 在startTime时执行调试,endTime结束执行调度,重复执行repeatCount次,每隔repeatInterval秒执行一次 * * @param startTime * 调度开始时间 * @param endTime * 调度结束时间 * @param repeatCount * 重复执行次数 * @param repeatInterval * 执行时间隔间 */ void schedule(Date startTime, Date endTime, int repeatCount, long repeatInterval); void schedule(Date startTime, Date endTime, int repeatCount, long repeatInterval, String group); /** * 在startTime时执行调试,endTime结束执行调度,重复执行repeatCount次,每隔repeatInterval秒执行一次 * * @param name * Quartz SimpleTrigger 名称 * @param startTime * 调度开始时间 * @param endTime * 调度结束时间 * @param repeatCount * 重复执行次数 * @param repeatInterval * 执行时间隔间 */ void schedule(String name, Date startTime, Date endTime, int repeatCount, long repeatInterval); void schedule(String name, Date startTime, Date endTime, int repeatCount, long repeatInterval, String group); /** * 暂停触发器 * * @param triggerName * 触发器名称 */ void pauseTrigger(String triggerName); /** * 暂停触发器 * * @param triggerName * 触发器名称 * @param group * 触发器组 */ void pauseTrigger(String triggerName, String group); /** * 恢复触发器 * * @param triggerName * 触发器名称 */ void resumeTrigger(String triggerName); /** * 恢复触发器 * * @param triggerName * 触发器名称 * @param group * 触发器组 */ void resumeTrigger(String triggerName, String group); /** * 删除触发器 * * @param triggerName * 触发器名称 * @return */ boolean removeTrigdger(String triggerName); /** * 删除触发器 * * @param triggerName * 触发器名称 * @param group * 触发器组 * @return */ boolean removeTrigdger(String triggerName, String group); }
实现类:SchedulerServiceImpl
package com.demo.serviceImpl; import java.text.ParseException; import java.util.Date; import java.util.UUID; import org.quartz.CronExpression; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.TriggerKey; import org.quartz.impl.triggers.CronTriggerImpl; import org.quartz.impl.triggers.SimpleTriggerImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.demo.service.SchedulerService; @Service("schedulerService") public class SchedulerServiceImpl implements SchedulerService { private static final String NULLSTRING = null; private static final Date NULLDATE = null; @Autowired private Scheduler scheduler; @Autowired private JobDetail jobDetail; @Override public void schedule(String cronExpression) { schedule(NULLSTRING, cronExpression); } @Override public void schedule(String name, String cronExpression) { schedule(name, NULLSTRING, cronExpression); } @Override public void schedule(String name, String group, String cronExpression) { try { schedule(name, group, new CronExpression(cronExpression)); } catch (ParseException e) { throw new IllegalArgumentException(e); } } @Override public void schedule(CronExpression cronExpression) { schedule(NULLSTRING, cronExpression); } @Override public void schedule(String name, CronExpression cronExpression) { schedule(name, NULLSTRING, cronExpression); } @Override public void schedule(String name, String group, CronExpression cronExpression) { if (isValidExpression(cronExpression)) { if (name == null || name.trim().equals("")) { name = UUID.randomUUID().toString(); } CronTriggerImpl trigger = new CronTriggerImpl(); trigger.setCronExpression(cronExpression); TriggerKey triggerKey = new TriggerKey(name, group); trigger.setJobName(jobDetail.getKey().getName()); trigger.setKey(triggerKey); try { scheduler.addJob(jobDetail, true); if (scheduler.checkExists(triggerKey)) { scheduler.rescheduleJob(triggerKey, trigger); } else { scheduler.scheduleJob(trigger); } } catch (SchedulerException e) { throw new IllegalArgumentException(e); } } } @Override public void schedule(Date startTime) { schedule(startTime, NULLDATE); } @Override public void schedule(Date startTime, String group) { schedule(startTime, NULLDATE, group); } @Override public void schedule(String name, Date startTime) { schedule(name, startTime, NULLDATE); } @Override public void schedule(String name, Date startTime, String group) { schedule(name, startTime, NULLDATE, group); } @Override public void schedule(Date startTime, Date endTime) { schedule(startTime, endTime, 0); } @Override public void schedule(Date startTime, Date endTime, String group) { schedule(startTime, endTime, 0, group); } @Override public void schedule(String name, Date startTime, Date endTime) { schedule(name, startTime, endTime, 0); } @Override public void schedule(String name, Date startTime, Date endTime, String group) { schedule(name, startTime, endTime, 0, group); } @Override public void schedule(Date startTime, int repeatCount) { schedule(null, startTime, NULLDATE, 0); } @Override public void schedule(Date startTime, Date endTime, int repeatCount) { schedule(null, startTime, endTime, 0); } @Override public void schedule(Date startTime, Date endTime, int repeatCount, String group) { schedule(null, startTime, endTime, 0, group); } @Override public void schedule(String name, Date startTime, Date endTime, int repeatCount) { schedule(name, startTime, endTime, 0, 0L); } @Override public void schedule(String name, Date startTime, Date endTime, int repeatCount, String group) { schedule(name, startTime, endTime, 0, 0L, group); } @Override public void schedule(Date startTime, int repeatCount, long repeatInterval) { schedule(null, startTime, NULLDATE, repeatCount, repeatInterval); } @Override public void schedule(Date startTime, Date endTime, int repeatCount, long repeatInterval) { schedule(null, startTime, endTime, repeatCount, repeatInterval); } @Override public void schedule(Date startTime, Date endTime, int repeatCount, long repeatInterval, String group) { schedule(null, startTime, endTime, repeatCount, repeatInterval, group); } @Override public void schedule(String name, Date startTime, Date endTime, int repeatCount, long repeatInterval) { schedule(name, startTime, endTime, repeatCount, repeatInterval, NULLSTRING); } @Override public void schedule(String name, Date startTime, Date endTime, int repeatCount, long repeatInterval, String group) { if (this.isValidExpression(startTime)) { if (name == null || name.trim().equals("")) { name = UUID.randomUUID().toString(); } TriggerKey triggerKey = new TriggerKey(name, group); SimpleTriggerImpl trigger = new SimpleTriggerImpl(); trigger.setKey(triggerKey); trigger.setJobName(jobDetail.getKey().getName()); trigger.setStartTime(startTime); trigger.setEndTime(endTime); trigger.setRepeatCount(repeatCount); trigger.setRepeatInterval(repeatInterval); try { scheduler.addJob(jobDetail, true); if (scheduler.checkExists(triggerKey)) { scheduler.rescheduleJob(triggerKey, trigger); } else { scheduler.scheduleJob(trigger); } } catch (SchedulerException e) { throw new IllegalArgumentException(e); } } } @Override public void pauseTrigger(String triggerName) { pauseTrigger(triggerName, NULLSTRING); } @Override public void pauseTrigger(String triggerName, String group) { try { scheduler.pauseTrigger(new TriggerKey(triggerName, group));// 停止触发器 } catch (SchedulerException e) { throw new RuntimeException(e); } } @Override public void resumeTrigger(String triggerName) { resumeTrigger(triggerName, NULLSTRING); } @Override public void resumeTrigger(String triggerName, String group) { try { scheduler.resumeTrigger(new TriggerKey(triggerName, group));// 重启触发器 } catch (SchedulerException e) { throw new RuntimeException(e); } } @Override public boolean removeTrigdger(String triggerName) { return removeTrigdger(triggerName, NULLSTRING); } @Override public boolean removeTrigdger(String triggerName, String group) { TriggerKey triggerKey = new TriggerKey(triggerName, group); try { scheduler.pauseTrigger(triggerKey);// 停止触发器 return scheduler.unscheduleJob(triggerKey);// 移除触发器 } catch (SchedulerException e) { throw new RuntimeException(e); } } private boolean isValidExpression(final CronExpression cronExpression) { CronTriggerImpl trigger = new CronTriggerImpl(); trigger.setCronExpression(cronExpression); Date date = trigger.computeFirstFireTime(null); return date != null && date.after(new Date()); } private boolean isValidExpression(final Date startTime) { SimpleTriggerImpl trigger = new SimpleTriggerImpl(); trigger.setStartTime(startTime); Date date = trigger.computeFirstFireTime(null); return date != null && date.after(new Date()); } }
在实际停止调度时,按下面方法就行
FeedbackController
package com.demo.controller; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import com.demo.base.BaseController; import com.demo.object.vo.ResultVO; import com.demo.service.FeedbackService; import com.demo.service.SchedulerService; @Controller public class FeedbackController extends BaseController { @Autowired private FeedbackService feedbackService; @Autowired private SchedulerService schedulerService; @ResponseBody @RequestMapping(value = "/event", method = RequestMethod.POST) public ResultVO add(HttpServletRequest request, Long eventId, Long userId, String message) { ResultVO result = new ResultVO(); System.out.println("hahaha"); feedbackService.add(eventId, userId, message); result.setMessage("Add success"); return result; } @ResponseBody @RequestMapping(value = "/stopScheduler", method = RequestMethod.GET) public ResultVO stopScheduler(HttpServletRequest request) { ResultVO result = new ResultVO(); schedulerService.pauseTrigger("work_default_name", "work_default"); result.setState(200); result.setMessage("scheduler stop success"); return result; } }