整合SpringMVC 和 Quartz 的两种方式
步骤前提:
搭建好开发环境,jar包。需要的jar包这里不一一诉说,这里只提供整合方式
1. 配置文件方式
配置文件的写法:
可单独建xml文件,也可写入*Content.xml文件中,主要确保启动的时候读取这个配置文件就可以了。
<bean name="startQuertz" lazy-init="false" autowire="no"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="myJobTrigger" />
</list>
</property>
</bean>
<!-- quartz-2.x的配置 -->
<bean id="myJobTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="myJobDetail" />
</property>
<property name="cronExpression">
<value>*/10 * * * * ?</value>
</property>
</bean>
<!-- 秒 分 时 日 月 周 年(可选)。 0/5 * * * * ? -->
<!-- 每隔5秒执行一次:*/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?
每天23点执行一次:0 0 23 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天23点执行一次:0 0 23 L * ?
每周星期天凌晨1点实行一次:0 0 1 ? * L
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?
每个整点执行 0 0 0-23 * * ? -->
<!-- 调度的配置结束 -->
<!-- job的配置开始 -->
<bean id="myJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="myJob" />
</property>
<property name="targetMethod">
<value>work</value>
</property>
<!-- 是否允许任务并发执行。当值为false时,表示必须等到前一个线程处理完毕后才再启一个新的线程 -->
<property name="concurrent" >
<value>false</value>
</property>
</bean>
<!-- job的配置结束 -->
<!-- 工作的bean -->
<bean id="myJob" class="com.sandyagor.time.quartz.MyJob" />
需要执行的方法写法:
在com.sandyagor.time.quartz.MyJob 包下写一个work方法就行了
如:
private static final SimpleDateFormat DATEFORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//时间格式化
private static int index = 0;
public void work(){
index++;
int t = index;
System.out.println("-----------------------------"+ t+" is running!"+DATEFORMATTER.format(new Date())+"-----------------------------");
try {
Thread.sleep(10*1000l);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("-----------------------------"+ t+" is over!"+DATEFORMATTER.format(new Date())+"-----------------------------");
}
另外:也可以简化配置文件:
但需要添加引入,在注解中有说明
2. Spring注解
添加需要的标签
xmlns 中添加:xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation 中添加:
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd
配置注解和计划任务:
<context:annotation-config />
<!-- 扫描类包,将Spring注解的类自动转化Bean,同时完成Bean的注入 -->
<context:component-scan base-package="com. sandyagor.time"/>
<!-- 注入方式执行定时任务 start-->
<task:annotation-driven executor="myExecutor" scheduler="myScheduler" />
<task:executor id="myExecutor" pool-size="5" />
<task:scheduler id="myScheduler" pool-size="10" />
如果不配置最后两行,控制台会有警告信息
如方式1的配置式启动,如果添加了标签可以使用简化的配置:
<!-- 定时器开关-->
<task:annotation-driven />
<!-- 管理的Bean -->
<bean id="appJob" class="com.sandyagor.time.quartz.MyJob"/>
<task:scheduled-tasks scheduler="task">
<!--每三秒执行一次 -->
<task:scheduled ref="appJob" method="work"
cron="0/3 * * * * ?" />
</task:scheduled-tasks>
<task:scheduler id="task" pool-size="10" />
End 方式1简化配置
下面说说注解的使用:
2.1 在需要运行的实现方法前加上spring的@Scheduled注解
@Scheduled(cron="0/5 * * * * ? ") //每5秒执行一次
cron表达式前文有介绍,还需要更多的功能请自行查找
2.2 任务的并行和顺序执行
@Component
这个注解会顺序执行任务,即如果任务时间执行较长,下一个任务会等待直到前一个任务执行完毕再执行。
@EnableScheduling
则会并行执行两个线程
@Async
则支持配置式的线程池, 会执行到 task:scheduler 最大的线程数量,占满以后等待开始的线程结束
具体的注解方式,请参照api文档。以上说法有纰漏之处望谅解,作为个人学习笔记用,不喜勿喷。共同学习,共同提高。Rome was not built in a day
截图:
ps:本文中的spring 为3.X,quzrtz为当前最新的2.2.2
提供2.2.2的下载连接,但需要一个积分,当辛苦费了。
quzrtz2.2.2 带官方文档