可靠的广州做手机网站中国网站排名网
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 * * ? * *”)