SpringBoot教程四定时任务cron表达式Shedule

前言需求描述

其实在实际的工程开发过程中,使用定时任务的是难以避免的一种情况,其实SpringBoot 的里面自带的定时任务比较好用,特别简单,但是有个问题就是这个太容易冲突了,管理不方便,如果定时任务少的话可以使用的。多的话不建议使用这个,多的话,使用XXjob或者Quartz 定时任务框架比较好一些!

1、简单说下Cron表达式

Cron 表达式的时间字段除允许设置数值外,还可使用一些特殊的字符,提供列表、范围、通配符等功
能,细说如下: 星号 (*) :可用在所有字段中,表示对应时间域的每一个时刻,例如, * 在分钟字段时,表示 每分钟
问号( ? ):该字符只在日期和星期字段中使用,它通常指定为 无意义的值 ,相当于占位符;
减号 (-) :表达一个范围,如在小时字段中使用 “10-12” ,则表示从 10 12 点,即 10,11,12
逗号 (,) :表达一个列表值,如在星期字段中使用 “MON,WED,FRI” ,则表示星期一,星期三和星期
五;
斜杠 (/) x/y 表达一个等步长序列, x 为起始值, y 为增量步长值。如在分钟字段中使用 0/15 ,则
表示为 0,15,30 45 秒,而 5/15 在分钟字段中表示 5,20,35,50 ,你也可以使用 */y ,它等同于 0/y
●L :该字符只在日期和星期字段中使用,代表 “Last” 的意思,但它在两个字段中意思不同。 L 在日期
字段中,表示这个月份的最后一天,如一月的 31 号,非闰年二月的 28 号;如果 L 用在星期中,则表示星
期六,等同于 7 。但是,如果 L 出现在星期字段里,而且在前面有一个数值 X ,则表示 这个月的最后 X
例如, 6L 表示该月的最后星期五;
●W :该字符只能出现在日期字段里,是对前导日期的修饰,表示离该日期最近的工作日。例如 15W
表示离该月 15 号最近的工作日,如果该月 15 号是星期六,则匹配 14 号星期五;如果 15 日是星期日,
则匹配 16 号星期一;如果 15 号是星期二,那结果就是 15 号星期二。但必须注意关联的匹配日期不能够
跨月,如你指定 1W ,如果 1 号是星期六,结果匹配的是 3 号星期一,而非上个月最后的那天。 W 字符串
只能指定单一日期,而不能指定日期范围;
●LW 组合:在日期字段可以组合使用 LW ,它的意思是当月的最后一个工作日;
井号 (#) :该字符只能在星期字段中使用,表示当月某个工作日。如 6#3 表示当月的第三个星期五 (6
表示星期五, #3 表示当前的第三个 ) ,而 4#5 表示当月的第五个星期三,假设当月没有第五个星期三,
忽略不触发;
● C :该字符只在日期和星期字段中使用,代表 “Calendar” 的意思。它的意思是计划所关联的日期,
如果日期没有被关联,则相当于日历中所有日期。例如 5C 在日期字段中就相当于日历 5 日以后的第一天。
1C 在星期字段中相当于星期日后的第一天。
Cron 表达式对特殊字符的大小写不敏感,对代表星期的缩写英文大小写也不敏感。

2、在线测试Cron表达式是否合规范可运行

 3、参考周五周末定时表达式的写法

4、SpringBoot定时器的使用java代码

主要的java代码比较简单可以直接注解使用

在当前的bean注入就可以的

@Component
public class NewsRetryJob {
@Scheduled(cron = "${app.job.news-retry-job.cron: 0 0 0/8 * * ?}")
public void retrySendNews() {
业务逻辑处理
}

}

主要类似上面的结构就可以的。

5、主要问题

使用这个很容易会导致冲突,目前我写的这个定时器任务就三个所有这个不会有冲突,定时器设置的是每隔一些质数,7,9,13分钟执行一次。避免冲突,因为cron表达式只要冲突的话,是直接跳过的。只会随机执行其中的一个,这个是业务以及发现了的,所以这个在复杂业务场景的情况下不建议这个使用。

 6、SpringBoot插入Quartz 定时器

SpringBoot里面启动的时候需要开启这个定时任务

@SpringBootApplication
@EnableScheduling 
public class WebApplication {
    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);
    } 
   }
Quartz 的使用思路
1 job - 任务 - 你要做什么事?
2 Trigger - 触发器 - 你什么时候去做?
3 Scheduler - 任务调度 - 你什么时候需要去做什么事?
需要插入一些配置话的代码

1、QuartzConfig    

创建Job对象

@Bean
public JobDetailFactoryBean jobDetailFactoryBean()  
@Configuration
public class QuartzConfig {
    /*** 1.创建 Job 对象 */
    @Bean
    public JobDetailFactoryBean jobDetailFactoryBean() {
        JobDetailFactoryBean factory = new JobDetailFactoryBean();
        //关联我们自己的 Job 类
        factory.setJobClass(QuartzDemo.class);
        return factory;
    }

    /*** 2(已不建议在使用这个简单地触发器).创建 Trigger 对象 * 简单的 Trigger( 仅能设置简单的定时任务,不支持cron表达式,最开始这么使用的,后来作废了) */
    @Bean
    public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {
        SimpleTriggerFactoryBean factory = new SimpleTriggerFactoryBean();
        //关联 JobDetail 对象
        factory.setJobDetail(jobDetailFactoryBean.getObject());
        //该参数表示一个执行的毫秒数
        factory.setRepeatInterval(2000);
        // 重复次数 factory.setRepeatCount(5);
        return factory;
    }

    /*** 2、Cron Trigger 超级推荐使用功能的是这个,目前业务复杂度提高之后,这个目前是主要在使用这个功能*/
    @Bean
    public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {
        CronTriggerFactoryBean factory = new CronTriggerFactoryBean();
        factory.setJobDetail(jobDetailFactoryBean.getObject());
        //设置触发时间
        factory.setCronExpression("0/2 * * * * ?");
        return factory;
    }

    /*** 3.创建 Scheduler 对象 */
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean cronTriggerFactoryBean, MyAdaptableJobFactory myAdaptableJobFactory) {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        //关联trigger
        factory.setTriggers(cronTriggerFactoryBean.getObject());
        factory.setJobFactory(myAdaptableJobFactory);
        return factory;
    }
}

7、一个定时任务简单地实现



import org.apache.commons.collections4.CollectionUtils;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

@Component
@DisallowConcurrentExecution
public class EventGenerateJob implements Job {


    @Autowired
    private TbmEventConfigDao tbmEventConfigDao;

    @Autowired
    private TbmEventTagConfigDao tbmEventTagConfigDao;

    @Autowired
    private EventService eventService;

    @Autowired
    private TbmEventExtendConfigDao tbmEventExtendConfigDao;

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        List<TbmEventConfig> eventConfigList = tbmEventConfigDao.getAll();
        for (TbmEventConfig item : eventConfigList) {
            List<TbmEventTagConfig> tagConfigList = tbmEventTagConfigDao.selectByEventId(item.getId());
            if (CollectionUtils.isEmpty(tagConfigList)) {
                continue;
            }
            List<TbmEventExtendConfig> eventExtendConfigList = tbmEventExtendConfigDao.selectByEventId(item.getId());
            try {
                eventService.buildEventInfo(item, tagConfigList,eventExtendConfigList);
            } catch (ApiException e) {
//                log.error("EventGenerateJob executeInternal() failed!event_no=" + item.getEventNo());
                e.printStackTrace();
            }
        }
    }
}

8、具体的实现可以参考

QrtzManager添加监听器定时任务执行_道阻且长-行则将至-行而不辍-未来可期的博客-CSDN博客

QuartzServiceImpl实现管理Quartz接口_道阻且长-行则将至-行而不辍-未来可期的博客-CSDN博客_quartz 接口

实际项目中quartz的应用定时器操作Spring注入 quartz.spi.TriggerFiredBundle 触发器管理定时任务_道阻且长-行则将至-行而不辍-未来可期的博客-CSDN博客

cron表达式是用于定义定时任务调度的一种时间表达式。在Vue中,可以使用vue-quartz插件来实现定时任务的调度。 首先,需要在项目中安装vue-quartz插件。可以通过npm或yarn进行安装: ``` npm install vue-quartz ``` 或 ``` yarn add vue-quartz ``` 安装完成后,在Vue的入口文件main.js中引入并注册vue-quartz插件: ```javascript import Vue from 'vue'; import VueQuartz from 'vue-quartz'; Vue.use(VueQuartz); ``` 接下来,在需要定义定时任务的组件中,使用`<cron>`标签来设置cron表达式: ```vue <template> <div> <h1>定时任务</h1> <cron v-model="cronExpression" @change="handleCronChange"></cron> </div> </template> <script> export default { data() { return { cronExpression: '' }; }, methods: { handleCronChange(cronExpression) { // 在这里可以处理cron表达式的变化,并执行相应的操作 console.log('cron表达式变化:', cronExpression); } } }; </script> ``` 在上面的示例中,通过`v-model`指令将cron表达式绑定到组件的data属性`cronExpression`上,并通过`@change`事件监听cron表达式的变化。 当用户在页面上选择或输入cron表达式时,`handleCronChange`方法会被调用,并传入新的cron表达式。在该方法中可以根据cron表达式执行相应的定时任务逻辑。 请注意,以上只是一个简单的示例,具体的定时任务逻辑需要根据实际需求进行实现。同时,需要了解cron表达式的语法规则和含义,以确保正确设置定时任务的执行时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道阻且长-行则将至-行而不辍-未来可期

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值