关于任务调度

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>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。