本文共 3155 字,大约阅读时间需要 10 分钟。
在项目开发中,定时任务是常见需求之一。Spring Boot提供了内置的定时方案,但当任务需求复杂化时,经常需要引入Quartz。以下将从简单到复杂,全面解析两种方案。
仅需引入Spring Boot Starter包即可:
org.springframework.boot spring-boot-starter
在启动类中添加@EnableScheduling
注解:
@SpringBootApplication@EnableSchedulingpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}
创建实现类并使用@Scheduled
注解:
@Componentpublic class SchedulerTask { private int count = 0; @Scheduled(fixedRate = 6000) private void process() { System.out.println("this is scheduler task running " + count++); }}
@Componentpublic class Scheduler2Task { private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); @Scheduled(cron="*/6 * * * * ?", fixedRate=6000) public void reportCurrentTime() { System.out.println("现在时间:" + dateFormat.format(new Date())); }}
fixedRate
:每隔固定秒数执行任务。fixedDelay
:任务完成后等待固定秒数后再执行。initialDelay
:第一次调度的延迟间隔。Quartz是一个开源的任务调度框架,支持复杂定时需求且能与Spring无缝集成。
在Spring Boot中使用Quartz需如下配置:
org.springframework.boot spring-boot-starter-quartz
定义Job并注册Trigger:
public class SampleJob extends QuartzJob { private String name; public void setName(String name) { this.name = name; } @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { System.out.println("Hello " + this.name + "!"); }}
配置JobDetail和Trigger:
@Configurationpublic class SampleScheduler { @Bean public JobDetail sampleJobDetail() { return JobBuilder.newJob(SampleJob.class) .withIdentity("sampleJob", "group1") .usingJobData("name", "World") .build(); } @Bean public Trigger sampleJobTrigger() { SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(2) .repeatForever(); return TriggerBuilder.newTrigger() .forJob(sampleJobDetail()) .withIdentity("sampleTrigger", "group1") .withSchedule(scheduleBuilder) .build(); }}
可以采取以下方式启动:
方式一:在启动类中启动
@SpringBootApplicationpublic class MainApplication extends CommandLineRunner { @Autowired privateatabase database; public static void main(String[] args) { SpringApplication.run(MainApplication.class, args); } @Override public void run(String[] args) throws Exception { schedulerService.start(); }}
方式二:集成Spring的@Scheduled注解
public class SchedulerListener { @Autowired private SchedulerService schedulerService; @Scheduled(cron="0 30 11 25 11 ?", enabled=true) public void schedule() { schedulerService.start(); }}
对于简单定时需求,Spring Boot内置方案足够;对复杂批量任务处理,经常选择Quartz。Spring Boot 2.0对Quartz的支持使其在项目中的应用更加流畅。
转载地址:http://ergdz.baihongyu.com/