Java任务调度
一、JDK Task
使用JDK自带的任务调度类,TimerTask和Timer。
📗 第一步,自定义任务类,继承TimerTask,重写run()方法
public class JdkTask extends TimerTask {
public void run() {
System.out.println(LocalDateTime.now() + " 任务执行:");
System.out.println("本人精通Java、C、Python、Ruby等单词的拼写");
}
}
📘 第二步,使用Timer时间调度器,按照指定规则,执行任务。
public static void main(String[] args) {
JdkTask task = new JdkTask();
Timer timer = new Timer();
timer.schedule(task, 3000);
}
调度规则的相关方法
二、Spring Task
- 使用Spring Task注解的方式,实现简单,且可以实现较为复杂的调度规则。
📗 第一步,自定义任务类,交给容器管理,自定义任务方法,使用@Scheduled配置调度规则。
@Component
public class TestJob {
// 配置当前方法为可调度的任务
@Scheduled(cron = "* * * 6 11 ?")
public void dosth1(){
System.out.println("任务1开始执行:" + LocalDateTime.now());
}
@Scheduled(cron = "* * * 6 11 ?")
public void dosth2(){
System.out.println("任务2开始执行:" + LocalDateTime.now());
}
}
📘 第二步,定义配置类,开启组件扫描,开启定时任务
@ComponentScan
@EnableScheduling // 开启定时任务
public class SystemConfig {
}
也可以通过XML开启组件扫描和任务驱动
<!-- 开启组件扫描 -->
<context:component-scan base-package="com.apesource"/>
<!-- XML开启注解任务驱动 -->
<task:annotation-driven/>
- 使用XML配置的形式
<bean id="testJobBean" class="com.apesource.job.TestJob"/>
<!-- 调度器池 -->
<task:scheduler id="poolTaskScheduler" pool-size="10"/>
<!-- 调度任务列表 -->
<task:scheduled-tasks>
<task:scheduled ref="testJobBean" method="dosth1" cron="* * * 6 11 ?"/>
<task:scheduled ref="testJobBean" method="dosth2" cron="* * * 6 11 ?"/>
</task:scheduled-tasks>
三、Quartz
使用Spring中集成的任务调度框架Quartz,首先需要添加相关依赖:
<!-- Quartz依赖 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
<!-- Spring集成Quartz,需要依赖spring-context-support -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.2.1.RELEASE</version>
</dependency>
<!-- Spring集成Quartz,需要依赖spring-transaction -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.1.RELEASE</version>
</dependency>
流程图:
Spring集成Quartz
📗 第一步,定义任务类,继承QuartzJobBean
public class MessageJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("执行发送短信任务" + LocalDateTime.now());
}
}
📘 第二步,配置XML,定义JobDetail,并注入Job;定义触发器Trigger,并注入JobDetail;定义Scheduler调度器工厂,注入触发器。
<!-- JobDetail:用于封装Job作业类 -->
<bean id="messageJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<!-- 注入Job作业类的完全限定名,由JobDetailFactoryBean通过反射创建 -->
<property name="jobClass" value="com.apesource.job.MessageJob"/>
</bean>
<!-- Trigger:触发器,用于设置调度规则 -->
<bean id="messageTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<!-- 注入时间调度规则 -->
<property name="cronExpression" value="5,10,13,17,21,25 * 10 6 11 ?"/>
<!-- 注入JobDetail -->
<property name="jobDetail" ref="messageJobDetail"/>
</bean>
<!-- 调度器工厂,用于创建调度器 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!-- 注入触发器集合 -->
<property name="triggers">
<list>
<ref bean="messageTrigger"/>
</list>
</property>
</bean>