quartz是用来做定时任务的,可以单独使用,也能在框架中使用,这里主要是想要介绍一下在spring中的使用。spring框架已经将quartz功能集成到框架中,也就是在spring.springframework.scheduling中直接就会有quartz。
使用步骤:
1.将quartz的包导入到项目中,因为我是在maven的项目中,所以在pom中添加一下依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>${quartz.version}</version>
<exclusions>
<exclusion>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
</exclusion>
</exclusions>
</dependency>
spring中已经集成了这个quartz的工具类,为什么还要重新导入包呢,这是因为spring的版本和quartz之间版本兼容的原因。之所以会在这里说出这个错误,是因为使用的时候,已经有了这个导入的包,但是总会报错,所以说这也是为了避免一个小小的坑。
2.当然就是配置的问题了,下面是具体配置
<!--
部门用户信息自动更新任务
-->
<!--需要调用的方法-->
<bean id="SyncDingDepartmentToSystemTask" class="com.mypro.poa.syn.SyncDingDepartmentToSystemTask"></bean>
<bean id="SyncDingUserToSystemTask" class="com.mypro.poa.syn.SyncDingUserToSystemTask"></bean>
<!--同步任务1-->
<bean id="jobTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!--实体类-->
<property name="targetObject" ref="SyncDingDepartmentToSystemTask"/>
<!--具体方法一-->
<property name="targetMethod" value="task1"/>
</bean>
<!--同步任务2-->
<bean id="jobTask2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="SyncDingUserToSystemTask"/>
<property name="targetMethod" value="task2"/>
</bean>
<!--定义触动器-->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<!--触发的事件-->
<property name="jobDetail" ref="jobTask"/>
<!--定义触发时间-->
<property name="cronExpression" value="30 45 8 * * ?"/>
</bean>
<bean id="cronTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobTask2"/>
<property name="cronExpression" value="30 45 8 * * ?"/>
</bean>
<bean id="schedulerFactoryBean" lazy-init="false" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger"/>
<ref bean="cronTrigger2"/>
</list>
</property>
</bean>
这个配置中的参数含义是:
字段 允许值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * /
提醒一下:在配置当中,前面的步骤相当于在准备工作,而最终要把这些需要执行的任务放在triggers的list,这样子才能被加载执行。
3.要执行的任务
public class SyncDingDepartmentToSystemTask{
public void task1(){
System.out.print("quartz1任务完成");
}
}
---------------------------
public class SyncDingUserToSystemTask{
public void task1(){
System.out.print("quartz2任务完成");
}
}
一个任务最好是对应一个方法,这样有利于任务的正常执行。如果同一个类中有多个方法,并且他们不相互影响,那么就可以将这些方法一次性调用。另外也能利用线程来达到目的,这里就不做展示。