springboot添加定时任务

springboot添加定时任务


搬砖中学习使用定时任务定时执行一些业务逻辑

一、@Scheduled注解

1、启动类添加@EnableScheduling
2、@Component添加至任务类,开启定时任务
3、@Scheduled添加至方法上,添加定时任务
可以指定cron、fixedRate、fixedDelay、initialDelay等属性。
过程:
(1)拦截“@Scheduled”注解的方法,并解析相应的的注解参数,放入“定时任务列表”等待后续处理;之后在“定时任务列表”中统一执行相应的定时任务(任务为顺序执行,先执行cron,之后再执行fixedRate)
(2)获取scheduled类参数,之后根据参数类型、相应的延时时间、对应的时区,将对应类型的定时器放入相应的“定时任务列表”中。
(3)定时任务先执行corn,判断定时任务的执行时间,计算出相应的下次执行时间,放入线程中,到相应的时间后进行执行。之后执行按“频率”(fixedRate)执行的定时任务,直到所有任务执行结束。

@Scheduled的一个缺点是定时时间不能动态更改,它适用于具有固定任务周期的任务,若要修改任务执行周期,实现SchedulingConfigurer接口,重写configureTasks方法。
在这里插入图片描述
参考:https://cloud.tencent.com/developer/article/1507776

二、使用quartz

Quartz是一个轻量级任务调度框架(库):

  • Scheduler - 用于与调度程序交互的主程序接口,调度程序。
  • Job - 预先定义的能被调度程序执行的任务类,实现org.quartz.Job接口。
  • JobDetail - 使用JobDetail来定义定时任务的实例。
  • Trigger - 触发器,表明任务在什么时候会执行。
  • JobBuilder -用于声明一个任务实例,也可以定义关于该任务的详情比如任务名、组名等,这个声明的实例将会作为一个实际执行的任务。
  • TriggerBuilder - 触发器创建器,用于创建触发器trigger实例。
  • JobDataMap-初始化定义信息,key-value形式。

引入依赖
在这里插入图片描述

启动类调用如下方法开启调度:

private void buildSchedule() {
        try {
         String cronParam = "0/1 * * * * ?";
            //基于Quartz属性文件创建Quartz Scheduler 调度程序
        StdSchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Properties prop = new Properties();
        //配置属性
        prop.setProperty("org.quartz.scheduler.instanceName", "taskSchduler");
        prop.setProperty("org.quartz.threadPool.threadCount", "1");
        prop.put("org.quartz.scheduler.instanceId", "AUTO");
        prop.put("org.quartz.scheduler.rmi.export", "false");
        prop.put("org.quartz.scheduler.rmi.proxy", "false");
        prop.put("org.quartz.scheduler.wrapJobExecutionInUserTransaction", "false");
        prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
        prop.put("org.quartz.threadPool.threadCount", "3");
        prop.put("org.quartz.threadPool.threadPriority", "5");
        prop.put("org.quartz.jobStore.class", "org.quartz.simpl.RAMJobStore");
        schedulerFactory.initialize(prop);

            JobDataMap jobDataMap = new JobDataMap();
            jobDataMap.put("userManagerService", userService);

            JobDetail job = newJob(Task.class)
                    .withDescription("定时task")
                    .withIdentity("job" , "group")
                    .setJobData(jobDataMap)
                    .build();

            Trigger trigger = newTrigger().withIdentity("trigger", "group")
                    .withSchedule(CronScheduleBuilder.cronSchedule(cronParam))
//                    .withSchedule(SimpleScheduleBuilder.simpleSchedule()
//                            .withIntervalInSeconds(1)//每隔1s执行一次
                    .build();

            Scheduler scheduler = schedulerFactory.getScheduler();
            // 使用定义的触发器trigger安排执行任务job
            scheduler.scheduleJob(job, trigger);
            //启动任务调度程序
            scheduler.start();
        }catch(SchedulerException e){
            e.printStackTrace();
        }

    }
/**
 * 具体任务,实现job接口
 */

public class Task implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
        IUserManagerService userService = (IUserManagerService)jobDataMap.get("userManagerService");
        System.out.println("执行job!!   用户:"+userService.getUserById("077ddaa6f1e94731ba1dce3825efe732").getUserName());
    }
}

参考:https://blog.csdn.net/zixiao217/article/details/53053598

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值