1. 定时器
项目开发中需要执行一些定时任务,比如在凌晨时候,更新一些新的信息,定时发送邮件等等
1.1. 实现方式
1.1.1. java.util.Timer
Java自带的java.util.Timer类,可以调度一个java.util.TimerTask任务。这种方式可以让程序按照某一个频度执行,但不能在指定的时间运行,一般用的比较少。
1.1.2. Quartz
使用Quartz,这是一个功能比较强大的调度器,可以让程序在指定的时间执行,也可以按照某一个频度执行,配置起来稍显复杂。
1.1.3. Spring Task
spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单。
1.2 .作业继承方式
一种方式是作业类需要继承特定的作业类基类,如Quartz需要继承:
org.springframework.scheduling.quartz.quartzJobBean;
java.util.Timer中需要继承自java.util.TimerTask。
另外一种即是一种普通的java类,不需要继承任何基类。
推荐使用第二种方式
2. Spring Task使用方式
2.1 配置方式
2.1.1 spring.xml
<!--配置定时任务-->
<task:scheduled-tasks>
<task:scheduled ref="job1" method="run" fixed-rate="5000"/>
</task:scheduled-tasks>
job1
public class job1 {
public void run(){
System.out.println("job1....."+new Date());
}
}
每隔五秒执行一次job1的run
2.1.2 spring.xml
克隆表达式
<task:scheduled-tasks>
<task:scheduled ref="job1" method="run" cron="0/5 * * * * ?"/>
</task:scheduled-tasks>
job1见2.1.1的
每隔五秒执行一次run方法(https://www.pppet.net/)
2.2 注解方式
我们会用到 @Scheduled注解,在每个方法上使用 @Scheduled(fixedRate = 2000)或者 @Scheduled(cron = “0-5 * * ? * *”),配置时间
spring.xml
<!--启动定时任务的注解驱动-->
<task:annotation-driven/>
job2
@Component
public class Job2 {
@Scheduled(fixedRate = 2000)
public void run1(){
System.out.println("job2....."+new Date());
}
}
每两秒运行一次
3 quartz的使用
一般使用上面的spring task即可,不用quartz定时任务
3.1 导入依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.3.2</version>
</dependency>
3.2 spring.xml
<!-- 线程池 -->
<bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="10" />
<property name="maxPoolSize" value="100" />
<property name="queueCapacity" value="500" />
</bean>
<!--FixedRate 定时任务 -->
<bean id="quartzJob" class="com.wanmait.mavendemo.job.QuartzJob" />
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="quartzJob" />
<property name="targetMethod" value="print" />
</bean>
<!-- Cron quartz-2.x 的配置 时间调度的两种写法 fixedRate和cron-->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean" >
<property name="jobDetail" ref="jobDetail" />
<property name="cronExpression" value="0/5 * * * * ?" />
</bean>
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail"></property>
<property name="startDelay" value="0" />
<!-- 调度工厂实例化后,经过 0 秒 开始执行调度 -->
<property name="repeatInterval" value="2000" />
<!-- 每 2 秒调度一次 -->
</bean>
<!-- 调度 看你用哪个 两种选一种 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<!--<ref bean="simpleTrigger" />-->
<ref bean="cronTrigger"/>
</list>
</property>
<property name="taskExecutor" ref="executor" />
</bean>
真正项目时候两种配置写一种就可以了,而且一般也使用spring task
**3.3 QuartzJob **
public class QuartzJob {
public void print()
{
System.out.println("quartzjob.........."+new Date());
}
}
Springboot的定时任务
在启动类上加@EnableScheduling即可开启定时任务
做一个任务类,加一个@Component注解来被spring管理,再在方法上加@Scheduled(fixedRate = 2000)或者 @Scheduled(cron = “0-5 * * ? * *”)