springboot定时任务常用两种方法

1.springboot自带注解式:
//@Component注解用于对那些比较中立的类进行注释;
//相对与在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释
@Component
@Configuration
二者区别:https://www.cnblogs.com/fnlingnzb-learner/p/10762905.html

@EnableScheduling // 1.开启定时任务
@EnableAsync // 2.开启多线程
public class MultithreadScheduleTask {

    @Async//异步开启
     @Scheduled(cron = " 0 0/30 8 * * ? ") //每天八点半
    public void first() throws InterruptedException {
        System.out.println("第一个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
        System.out.println();
        Thread.sleep(1000 * 10);
    }

    @Async
    @Scheduled(fixedDelay = 2000) //每隔2秒
    public void second() {
        System.out.println("第二个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
        System.out.println();
    }
}

第一个定时任务和第二个定时任务互不影响,由于开启了多线程,第一个任务的执行时间也不受其本身执行时间的限制,所以需要注意可能会出现重复操作导致数据异常

2.Quartz框架
1).添加依赖


org.quartz-scheduler
quartz
2.2.1


org.quartz-scheduler
quartz-jobs
2.2.1

2).配置类QuartzConfig :
import com.perdo.user.controller.DateTimeJob;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QuartzConfig {
@Bean
public JobDetail printTimeJobDetail(){
return JobBuilder.newJob(DateTimeJob.class)//PrintTimeJob我们的业务类
.withIdentity(“DateTimeJob”)//可以给该JobDetail起一个id
//每个JobDetail内都有一个Map,包含了关联到这个Job的数据,在Job类中可以通过context获取
.usingJobData(“msg”, “Hello Quartz”)//关联键值对
.storeDurably()//即使没有Trigger关联时,也不需要删除该JobDetail
.build();
}
@Bean
public Trigger printTimeJobTrigger() {
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(“0/5 * * * * ?”);
return TriggerBuilder.newTrigger()
.forJob(printTimeJobDetail())//关联上述的JobDetail
.withIdentity(“quartzTaskService”)//给Trigger起个名字
.withSchedule(cronScheduleBuilder)
.build();
}
}

3)业务类QuartzJobBean.
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.quartz.QuartzJobBean;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateTimeJob extends QuartzJobBean {

@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
    //获取JobDetail中关联的数据
    //String msg = (String) jobExecutionContext.getJobDetail().getJobDataMap().get("msg");
    System.out.println("---------------------------------------> 5s");
}

}

详细:https://blog.csdn.net/chenmingxu438521/article/details/94485695

你可能感兴趣的:(springboot定时任务常用两种方法)