美高梅网投网站-美高梅手机网投-美高梅官方网站
做最好的网站

您的位置:美高梅网投网址 > 美高梅网站 > @Scheduled 参数可以承受二种定时的设置,使用@S

@Scheduled 参数可以承受二种定时的设置,使用@S

发布时间:2019-09-27 04:57编辑:美高梅网站浏览(175)

    在平常项目运转中,我们总会有供给在某不经常间段周期性的施行有个别动作。譬喻每日在有些时刻段导出报表,大概每隔多久总括二次未来在线的客户量。在springboot中得以有广大方案去帮我们做到电磁打点计时器的行事,有Java自带的java.util.Timer类,也可能有强劲的调整器Quartz,还会有SpringBoot自带的Scheduled,明天重大说说Scheduled。

    SpringBoot集成Quartz

    定期职责Quartz : 正是在钦点的时间实施贰次依然循环试行,在品种的支付中有时会须要的, 依旧很有用的.

    v反应计时器相比

    框架名称 Cron表达式 固定间隔执行 固定频率执行 任务持久化 难易度
    TimerTask 不支持 支持 支持 不支持 一般
    schedule 支持 支持 支持 不支持 简单
    Quartz 支持 支持 支持 支持

    在实际利用中,若无布满式场景(quartz 扶助布满式, schedule 不帮忙(须要和煦实现,用布满式锁),schedule跟spring结合的越来越好,依旧很适用的。

    SpringBoot内置的按时

    1. 加上信赖
    <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter</artifactId></dependency>
    
    1. 启航类上加多注脚
    @SpringBootApplication@EnableSchedulingpublic class SpringbootQuartzApplication {}
    
    1. 开创定时实践的职责类

    方式一:

    @Componentpublic class SchedulerTask {        private int count = 0;        /**     * @Author Smith     * @Description 设置没6秒执行一次     * @Date 14:23 2019/1/24     * @Param      * @return void     **/    @Scheduled(cron = "*/6 * * * * ?")    private void process(){        System.out.println("this is scheduler task running " + ;    }    }
    

    方式二:

    @Componentpublic class SchedulerTask2 {        private static final SimpleDateFormat dateFormat =            new SimpleDateFormat("HH:mm:ss");        /**     * @Author Smith     * @Description 设置没6秒执行一次     * @Date 14:22 2019/1/24     * @Param      * @return void     **/    @Scheduled(fixedRate = 6000)    private void process(){        System.out.println("now time is " + dateFormat.format(new Date;    }    }
    

    v创建schedule工程

    使用IntelliJ IDEA创建helloschedule

    美高梅手机网投 1

    美高梅手机网投 2

    美高梅手机网投 3

    美高梅手机网投 4

    美高梅手机网投 5

    点击finish完结项指标创办。

    美高梅手机网投 6

    为了便于演示,使用@Slf4j输出日志,增多lombok援用,@Slf4j不通晓的能够看看SpringBoot配置logback日志

    添加export类。

    package com.task.log;import lombok.extern.slf4j.Slf4j;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Component;import java.text.SimpleDateFormat;import java.util.Date;/** * Created by toutou on 2018/10/20. */@Component@Slf4jpublic class export {    @Scheduled(cron = "0 0/1 * * * ?")    public void minuteExport(){        log.debug("每分钟执行一次的任务:" + getDate;    }    @Scheduled(fixedRate = 5000)    public void fiveSecondExport(){        log.debug("每5秒执行一次:" + getDate;    }    @Scheduled(cron = "0/2 * * * * ?")    public void twoSecondExport(){        log.debug("每2秒执行一次:" + getDate;    }    @Scheduled(cron = "0 55 14 ? * *")    public void regularTimeExport(){        log.debug("每天上午14点55分执行:" + getDate;    }    private String getDate(){        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        return sdf.format(new Date;    }}
    

    起步类中增多@EnableScheduling解说,然后运营。

    美高梅手机网投 7

    翻开AMDliJ IDEA调节台日志和情理文件日志

    美高梅手机网投 8

    美高梅手机网投 9

    如上海图书馆,简单的按时职务输出日志搭建实现。

    参数表明

    @Scheduled 参数能够承受三种定时的设置,一种是大家常用的 cron="/6 * * * ?",一种是 fixedRate = 五千,二种都可代表固定周期试行定时职务。

    fixedRate说明

    • @Scheduled(fixedRate = 伍仟):上壹遍始发施行时间点之后 6 秒再进行。
    • @Scheduled(fixedDelay = 伍仟):上三次举行完结时间点之后 6 秒再实行。
    • @Scheduled(initialDelay=一千, fixedRate=四千):第贰遍推迟 1 秒后实践,之后按 fixedRate 的条条框框每 6 秒施行叁遍。

    cron说明

    cron一定有七人数,最终一个人是年,SpringBoot按时方案只需求安装六个人就能够:

    • 第一位, 表示秒, 取值是0 ~ 59
    • 第二位, 表示分. 取值是0 ~ 59
    • 其三人, 表示小时, 取值是0 ~ 23
    • 第四位, 表示天/日, 取值是0 ~ 31
    • 第八位, 表示月份, 取值是1 ~ 12
    • 第五人, 表示星期, 取值是1 美高梅手机网投,~ 7, 周二,周二..., 还会有 1 表示礼拜日
    • 第八个人, 年份, 能够留空, 取值是一九六六 ~ 2099

    cron中,还会有一部分标新立异的号子,含义如下:

    • 美高梅网投网站,星号,能够知道为每的意思,每秒、每分、每一天、每月、每年...。
    • 问号,问号只能出现在日期和星期那八个地点,表示那一个岗位的值不明显,天天3 点实行,由此第八人星期的职责,是不供给关注的,便是不鲜明的值;同临时间,日期和星期是多个相互排斥的因素,通过问号来申明不钦定值,比方1 月 10 日是周二,假如在星期的职位另钦点周一,就上下争持抵触了。
    • 减号,表明四个范围,如在小时字段中利用“10 - 12”,则象征从 10 到 12 点,即 10、11、12。
    • 逗号,表明四个列表值,如在星期字段中使用“1,2,4”,则代表星期二、周二、周一。
    • 美高梅官方网站,斜杠,如 x/y,x 是发端值,y 是开间,比如在首先位,0/15 正是从 0 秒初阶,每隔 15 秒试行三回,最终就是 0、15、30、45、60,另 */y,等同于 0/y。

    举多少个例子熟知一下:

    • 0 0 3 * * ? :每天 3 点执行;
    • 0 5 3 * * ?:每天 3 点 5 分执行;
    • 0 5 3 ? * *:天天 3 点 5 分试行,与地方成效一样;
    • 0 5/10 3 * * ?:每日 3 点的 5 分、15 分、25 分、35 分、45 分、55分那么些时间点试行;
    • 0 10 3 ? * 1:每一周星期六,3 点 10 分试行,注,1 表示星期六;
    • 0 10 3 ? * 1#3:每一个月的第四个礼拜,星期日举办,# 号只可以现身在星期的岗位。

    繁多SpringBoot自带的定期正是这么轻松了.

    vcron详细表明

    cron表明式,有特别的语法,何况以为有个别绕人,可是大致来说,大家记住一些常用的用法就能够,特殊的语法能够单独去查。

    cron一共有7位,然则最后一个人是年,能够留空,所以我们能够写6位:

    首先位,表示秒,取值0-56遍之位,表示分,取值0-59第几位,表示小时,取值0-23第肆人,日期天/日,取值1-31第四人,日期月份,取值1-12第七人,星期,取值1-7,礼拜三,星期四...,注:不是第1周,第二周的意思 别的:1意味着周天,2意味着星期二。第三个人,年份,能够留空,取值1968-2099

    cron中,还会有部分奇特的暗号,含义如下:

    (*)星号:可以理解为每的意思,每秒,每分,每天,每月,每年...(?)问号:问号只能出现在日期和星期这两个位置,表示这个位置的值不确定,每天3点执行,所以第六位星期的位置,我们是不需要关注的,就是不确定的值。同时:日期和星期是两个相互排斥的元素,通过问号来表明不指定值。比如,1月10日,比如是星期1,如果在星期的位置是另指定星期二,就前后冲突矛盾了。减号:表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12逗号:表达一个列表值,如在星期字段中使用“1,2,4”,则表示星期一,星期二,星期四斜杠:如:x/y,x是开始值,y是步长,比如在第一位 0/15就是,从0秒开始,每15秒,最后就是0,15,30,45,60    另:*/y,等同于0/y
    

    附表:

    "0 0 12 * * ?" 每天中午12点触发 "0 15 10 ? * *" 每天上午10:15触发 "0 15 10 * * ?" 每天上午10:15触发 "0 15 10 * * ? *" 每天上午10:15触发 "0 15 10 * * ? 2005" 2005年的每天上午10:15触发 "0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发 "0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发 "0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 "0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发 "0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发 "0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发 "0 15 10 15 * ?" 每月15日上午10:15触发 "0 15 10 L * ?" 每月最后一日的上午10:15触发 "0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发 "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发 每隔5秒执行一次:*/5 * * * * ?每隔1分钟执行一次:0 */1 * * * ?每天23点执行一次:0 0 23 * * ?每天凌晨1点执行一次:0 0 1 * * ?每月1号凌晨1点执行一次:0 0 1 1 * ?每月最后一天23点执行一次:0 0 23 L * ?每周星期天凌晨1点实行一次:0 0 1 ? * L
    

    crontab 表达式在线生成

    任何参谋资料:

    • Getting Started · Scheduling Tasks
    • java - quartz相比于springboot schedule的优点?
    • Spring Boot Quartz Scheduler Example: Building an Email Scheduling app | CalliCoder
    • SpringBoot之旅 -- 定期任务两种(Spring Schedule 与 Quartz 整合 )完成

    作  者:请叫自身头头哥
    出  处:
    有关小编:专心于基础平台的项目开销。如失常或提出,请多多赐教!
    版权声明:本文版权归作者和新浪共有,招待转发,但未经笔者同意必需保留此段证明,且在小说页面分明地点给出原来的文章链接。
    明知故犯表明:全部评价和私信都会在第不经常间回复。也迎接园子的大大们指正错误,共同进步。可能直接私信小编
    赞助博主:要是你以为文章对你有协理,能够点击作品右下角**一下子。您的砥砺是笔者坚贞不屈原创和持续写作的最大重力!

    Quartz

    提出写代码的时候下载下代码来走访目录结构
    Quartz有八个主旨概念:

    • Job:是三个接口,只定义一个办法 execute(JobExecutionContext context),在促成接口的 execute 方法中编辑所须求定期实践的 Job,JobExecutionContext 类提供了调治应用的一部分音信;Job 运维时的新闻保存在 JobDataMap 实例中。
    • JobDetail:Quartz 每便调治 Job 时,都再也创造二个 Job 实例,因而它不接受二个 Job 的实例,相反它接受贰个 Job 实现类(JobDetail,描述 Job 的落到实处类及另外连锁的静态音讯,如 Job 名字、描述、关联监听器等音讯),以便运行时经过 newInstance() 的反射机制实例化 Job。
    • rigger:是二个类,描述触发 Job 施行的岁月接触准则,首要有 SimpleTrigger 和 CronTrigger 那七个子类。当且仅当需调节贰次照旧以一定时间间隔周期施行调解,SimpleTrigger 是最切合的选料;而 CronTrigger 则足以经过 Cron 表明式定义出各个繁复时间准绳的调整方案:如专门的职业日星期四到星期三的 15:00 ~ 16:00 施行调节等。
    • Scheduler:调整器就一定于三个器皿,装载着职责和触发器,该类是三个接口,代表一个Quartz 的独门运作容器,Trigger 和 JobDetail 可以登记到 Scheduler 中,两个在 Scheduler 中具备各自的组及名称,组及名称是 Scheduler 查找定位容器中某一对象的基于,Trigger 的组及名称必得独一,JobDetail 的组和名称也亟须独一(但可以和 Trigger 的组和称号一致,因为它们是例外系列的)。Scheduler 定义了四个接口方法,允许外部通过组及名称访谈和调控容器中 Trigger 和 JobDetail。

    美高梅手机网投 10

    Job 为作业的接口,为职分调治的指标;JobDetail 用来描述 Job 的兑现类及别的连锁的静态音信;Trigger 做为作业的定时管理工科具,二个Trigger 只好对应贰个功课实例,而三个功课实例可对应多个触发器;Scheduler 做为按时职责容器,是 Quartz 最上层的东西,它帮助了具备触发器和课业,使它们协和专业,每一种 Scheduler 都存有 JobDetail 和 Trigger 的挂号,多个 Scheduler 中得以登记四个JobDetail 和两个 Trigger。

    整合
    1. 引进注重:
    <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-quartz</artifactId></dependency>
    
    1. 定期输出HelloWorld(使用Scheduler 运转)

    首先定义三个Job

    public class SampleJob extends QuartzJobBean {    private String name;    public void setName(String name) {        this.name = name;    }    @Override    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {        System.out.println("Quartz ---->  Hello, " + this.name);    }}
    

    构建JobDetail:

    @Configurationpublic class SampleScheduler {    @Bean    public JobDetail sampleJobDetail() {        // 链式编程,可以携带多个参数,在Job类中声明属性 + setter方法        return JobBuilder.newJob(SampleJob.class).withIdentity("sampleJob")                .usingJobData("name","World").storeDurably;    }    @Bean    public Trigger sampleJobTrigger(){        // 每隔两秒执行一次        SimpleScheduleBuilder scheduleBuilder =                SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds.repeatForever();        return TriggerBuilder.newTrigger().forJob(sampleJobDetail.withIdentity("sampleTrigger")                .withSchedule(scheduleBuilder).build();    }}
    
    • JobBuilder 无构造函数,只好通过 JobBuilder 的静态方法 newJob(Class jobClass)生成 JobBuilder 实例。
    • withIdentity 方法能够流传多个参数 withIdentity(String name,String group) 来定义 TriggerKey,也得以不设置,像上文示例中会自动生成三个无比的 TriggerKey 用来分别差异的 Trigger。
    1. CronSchedule方式

    CronSchedule能够安装越来越灵活的格局,定服装置与SpringBoot自带的表明式同样.

    同理,先定义多个个Job,与ScheduledJob一样,然则实现Job接口,如下:

    第一个job:

    public class ScheduledJob implements Job {    private String name;    public void setName(String name) {        this.name = name;    }    @Override    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {        SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");        System.out.println("CRON ----> schedule job1 is running ... + " + name + "  ---->  " + dateFormat.format(new Date;    }}
    

    第二个Job

    public class ScheduledJob2 implements Job {    private String name;    public void setName(String name) {        this.name = name;    }    @Override    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {        SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");        System.out.println("CRON ----> schedule job2 is running ... + " + name + "  ---->  " + dateFormat.format(new Date;    }}
    

    营造Schedule来进行职务:

    @Componentpublic class CronSchedulerJob {    @Autowired    private SchedulerFactoryBean schedulerFactoryBean;    private void scheduleJob1(Scheduler scheduler) throws SchedulerException {        JobDetail jobDetail = JobBuilder.newJob(ScheduledJob.class) .withIdentity("job1", "group1").build();        // 6的倍数秒执行 也就是 6 12 18 24 30 36 42 ....        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/6 * * * * ?");        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")                .usingJobData("name","王智1").withSchedule(scheduleBuilder).build();        scheduler.scheduleJob(jobDetail,cronTrigger);    }    private void scheduleJob2(Scheduler scheduler) throws SchedulerException{        JobDetail jobDetail = JobBuilder.newJob(ScheduledJob2.class) .withIdentity("job2", "group2").build();        // 12秒的倍数执行  12  24 36  48  60        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/12 * * * * ?");        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger2", "group2")                .usingJobData("name","王智2").withSchedule(scheduleBuilder).build();        scheduler.scheduleJob(jobDetail,cronTrigger);    }    /**     * @Author Smith     * @Description 同时启动两个定时任务     * @Date 16:31 2019/1/24     * @Param     * @return void     **/    public void scheduleJobs() throws SchedulerException {        Scheduler scheduler = schedulerFactoryBean.getScheduler();        scheduleJob1(scheduler);        scheduleJob2(scheduler);    }}
    

    触发定期职责有二种艺术:

    首先种是连串运维时施行:

    @Componentpublic class MyStartupRunner implements CommandLineRunner {    @Autowired    public CronSchedulerJob scheduleJobs;    @Override    public void run(String... args) throws Exception {        scheduleJobs.scheduleJobs();        System.out.println(">>>>>>>>>>>>>>>定时任务开始执行<<<<<<<<<<<<<");    }}
    

    第三种是按时实施:

    @Configuration@EnableScheduling@Componentpublic class SchedulerListener {    @Autowired    public CronSchedulerJob scheduleJobs;    @Scheduled(cron="0 47 16 24 1 ?")    public void schedule() throws SchedulerException {        scheduleJobs.scheduleJobs();        System.out.println(">>>>>>>>>>>>>>>定时任务开始执行<<<<<<<<<<<<<");    }}
    

    三种运行方案,在品种中精选一种选择就能够,不然会形成重复运行按时任务而报错。 所以在测量检验某四个运营时,将另贰个类上的疏解注释掉就足以了.

    小编刚起始工作,所以一时半刻还没境遇定期任务方面必要,然则总认为那么些将来会用,提前攻读一下,何况自己以为这一个定期职责也是挺有趣. 在SpringBoot自带的机械漏刻中笔者不知晓能或不能够传递参数,可是quartz是能够,所以说只要必要传递参数的话正是用quartz相对没难题.

    源码:

    本文由美高梅网投网址发布于美高梅网站,转载请注明出处:@Scheduled 参数可以承受二种定时的设置,使用@S

    关键词:

上一篇:美高梅官方网站:c#操作xml文件

下一篇:没有了