• 商城项目团购之定时任务


    1.什么是Quartz

    Quartz:水晶、石英,一个简单朴素有美丽的名字,在Java程序界,Quartz大名鼎鼎,很多Java应用几乎都集成或构建了一个定时任务调度系统,Quartz是一个定时任务调度框架。

    何为定时任务调度框架?简而言之,它可以领会我们的意图在未来某个时刻做我们想要做的事情.它简单易上手,并且可以与Spring集成.

    2.Quartz的相关名词

    调度器:Scheduler

    任务:JobDetail

    触发器:Trigger,包括SimpleTrigger和CronTrigger

    3.Quartz的使用

     3.1 首先我们需要定义实现一个定时功能的接口,我们可以称之为Task(或Job),如定时发送邮件的task(Job),重启机器的task(Job),优惠券到期发送短信提醒的task(Job),实现接口如下:

     3.2 有了任务之后,还需要一个能够实现触发任务去执行的触发器,触发器Trigger最基本的功能是指定Job的执行时间,执行间隔,运行次数等。

     3.3 有了Job和Trigger后,怎么样将两者结合起来呢?即怎样指定Trigger去执行指定的Job呢?这时需要一个Schedule,来负责这个功能的实现。

     4.Quartz的应用

    4.1 导入quartz的依赖包、

    <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>2.3.0</version>
    </dependency>
    

     4.2 新建一个能够打印任意内容的Job:

    /**
     * Created by wanggenshen
     * Date: on 2018/7/7 16:28.
     * Description: 打印任意内容
     */
    public class PrintWordsJob implements Job{
    
        @Override
        public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
            String printTime = new SimpleDateFormat("yy-MM-dd HH-mm-ss").format(new Date());
            System.out.println("PrintWordsJob start at:" + printTime + ", prints: Hello Job-" + new Random().nextInt(100));
    
        }
    }
    

     4.3 创建Schedule,执行任务:

    public class MyScheduler {
    
        public static void main(String[] args) throws SchedulerException, InterruptedException {
            // 1、创建调度器Scheduler
            SchedulerFactory schedulerFactory = new StdSchedulerFactory();
            Scheduler scheduler = schedulerFactory.getScheduler();
            // 2、创建JobDetail实例,并与PrintWordsJob类绑定(Job执行内容)
           JobDetail jobDetail = JobBuilder.newJob(PrintWordsJob.class).withIdentity("job1", "group1").build();
            // 3、构建Trigger实例,每隔1s执行一次
            Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1")
                    .startNow()//立即生效
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                    .withIntervalInSeconds(1)//每隔1s执行一次
                    .repeatForever()).build();//一直执行
    
            //4、执行
            scheduler.scheduleJob(jobDetail, trigger);
            System.out.println("--------scheduler start ! ------------");
            scheduler.start();
    
            //睡眠
            TimeUnit.MINUTES.sleep(1);
            scheduler.shutdown();
            System.out.println("--------scheduler shutdown ! ------------");
    
    
        }
    }
    

     4.4 Quartz核心详解

         1.Job和JobDetail

         Job是Quartz中的一个接口,接口下只有execute方法,在这个方法中编写业务逻辑。

         JobDetail用来绑定Job,为Job实例提供许多属性:

             2.1 name

             2.2 group

             2.3 jobClass

             2.4 jobDataMap

           JobDetail绑定指定的Job,每次Scheduler调度执行一个Job的时候,首先会拿到对应的Job,然后创建该Job实例,再去执行Job中的execute()的内容,任务执行结束后,关联的Job对象实例会被释放,且会被JVM GC清除。

    JobDetail定义的是任务数据,而真正的执行逻辑是在Job中。

    这是因为任务是有可能并发执行,如果Scheduler直接使用Job,就会存在对同一个Job实例并发访问的问题。而JobDetail & Job 方式,Sheduler每次执行,都会根据JobDetail创建一个新的Job实例,这样就可以规避并发访问的问题。

         2.JobExecutionContext

        JobExecutionContext中包含了Quartz运行时的环境以及Job本身的详细数据信息。当Schedule调度执行一个Job的时候,就会将JobExecutionContext传递给该Job的execute()中,Job就可以通过JobExecutionContext对象获取信息。

         3.JobDataMap

     JobDataMap实现了JDK的Map接口,可以以Key-Value的形式存储数据,JobDetail、Trigger都可以使用JobDataMap来设置一些参数或信息,Job执行execute()方法的时候,JobExecutionContext可以获取到JobExecutionContext中的信息:

         4.Trigger、SimpleTrigger、CronTrigger

  • 相关阅读:
    flink-cdc读取postgres报异常,没有发布表
    yum 安装高版本Git
    分布式存储FastDFS搭建
    ElasticSearch6.5.1集群部署
    CentOS7 OpenSSH编译安装升级
    K8S使用ceph实现持久化存储
    ceph分布式集群的搭建
    canal服务搭建
    MySQL-5.7.31的搭建
    基于CentOS7.6使用KubeOperator安装Kubernetes集群
  • 原文地址:https://www.cnblogs.com/cainame/p/11698643.html
Copyright © 2020-2023  润新知