任务调度-定时任务(Quartza、spring-task)

任务调度-定时任务

  • 什么时间做什么事
  • 解决方案:
    • Quartza
    • spring-task
    • crontab(linux)
    • azkaban
  • 名词
    • Schedule:任务调度器
    • Trigger:触发器,指定具体执行时间 CronTrigger
    • JobDetail(Job) :执行的任务

快速入门

Quartza

导入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>5.0.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>5.0.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>2.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz-jobs</artifactId>
        <version>2.2.1</version>
    </dependency>
</dependencies>

创建一个Job类

public class JobDemo {
	//定时要执行的业务操作
    public void run(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(sdf.format(new Date()));
    }
}

添加配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
						http://www.springframework.org/schema/beans/spring-beans.xsd
						http://www.springframework.org/schema/context
						http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="jobDemo" class="com.itheima.jobs.JobDemo"></bean>

    <!--配置任务-->
    <bean id="jobDetail1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="jobDemo"/>
        <property name="targetMethod" value="run"/>
    </bean>

    <!--配置触发器-->
    <bean id="cronTrigger1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="jobDetail"/>
        <property name="cronExpression" value="0/10 * * * * ?"/>
    </bean>

    <!--配置调度工厂-->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="cronTrigger1"/>
            </list>
        </property>
    </bean>
</beans>

启动测试

public class App {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-jobs.xml");
    }
}

cron表达式

秒 分 时 日 月 星期 [年]

? :占位符,没有任何意义。怎么用?

​ 日和星期必须有且只能有一个设置成?号

*:任意值,在取值范围中的所有值

,: 1,2,3 获取指定的值中的任何一个值

-: 5-10 从第5秒到第10秒这个范围内容,都执行

/: num1/num2 从num1开始,每个num2执行一次。 0/5

在线生成 Cron 表达式:http://cron.qqe2.com/


spring-task

添加配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
						http://www.springframework.org/schema/beans/spring-beans.xsd
						http://www.springframework.org/schema/task
						http://www.springframework.org/schema/task/spring-task.xsd
						http://www.springframework.org/schema/context
						http://www.springframework.org/schema/context/spring-context.xsd">
    <!--开启task的名称空间-->

    <!-- 包扫描-->
    <context:component-scan base-package="cn.itcast"/>
    <!--开启task的注解支持-->
    <task:annotation-driven/>
</beans>

编写Job类


@Component
public class MyJob {


    @Scheduled(cron = "* * * * * ?")
    public void run(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(sdf.format(new Date()));
    }
}

SpringTask和Quartz的区别

SpringTask:

默认是单线程同步执行的
	一个任务执行完上一次之后,才会执行下一次调度

Quartz:

默认是多线程异步执行的
	一个任务在上一次调度未完成执行,下一次调度时间到时,会另起一个线程开始新的调度。

总结:

​ 简单的功能,SpringTask和Quartz都能实现的需要,建议使用SpringTask

​ Quartz的功能要比SpringTask相对来更强大些。

posted @ 2020-10-14 21:54  德华。  阅读(423)  评论(0编辑  收藏  举报