Quartz简单入门

    技术2022-07-11  92

    Quartz简单入门


    1、依赖

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>

    2、使用

    package org.sang.quartz; import org.springframework.stereotype.Component; import java.util.Date; @Component public class MyFirstJob { public void sayHello() { System.out.println("MyFirstJob:sayHello:"+new Date()); } } package org.sang.quartz; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; import java.util.Date; public class MySecondJob extends QuartzJobBean { private String name; public void setName(String name) { this.name = name; } @Override protected void executeInternal(JobExecutionContext context){ System.out.println("hello:"+name+":"+new Date()); } }

    Job 可以是一个普通的 JavaBean,如果是普通的 JavaBean,那么可以先添加@Component 注解 将之注册到 Spring 容器中。 Job 也可以继承抽象类 QuartzJobBean,若继承自 Quartz}obBean,则需 要实现该类中的 executelnternal 方法,该方法在任务被调用时使用。


    package org.sang.quartz; import org.quartz.CronTrigger; import org.quartz.JobDataMap; import org.quartz.SimpleTrigger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.quartz.*; @Configuration public class QuartzConfig { @Bean MethodInvokingJobDetailFactoryBean jobDetail1() { MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean(); bean.setTargetBeanName("myFirstJob"); bean.setTargetMethod("sayHello"); return bean; } @Bean JobDetailFactoryBean jobDetail2() { JobDetailFactoryBean bean = new JobDetailFactoryBean(); bean.setJobClass(MySecondJob.class); JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put("name","sang"); bean.setJobDataMap(jobDataMap); bean.setDurability(true); return bean; } @Bean SimpleTriggerFactoryBean simpleTrigger() { SimpleTriggerFactoryBean bean = new SimpleTriggerFactoryBean(); bean.setJobDetail(jobDetail1().getObject()); bean.setRepeatCount(3); bean.setStartDelay(1000); bean.setRepeatInterval(2000); return bean; } @Bean CronTriggerFactoryBean cronTrigger() { CronTriggerFactoryBean bean = new CronTriggerFactoryBean(); bean.setJobDetail(jobDetail2().getObject()); bean.setCronExpression("* * * * * ?"); return bean; } @Bean SchedulerFactoryBean schedulerFactory() { SchedulerFactoryBean bean = new SchedulerFactoryBean(); SimpleTrigger simpleTrigger = simpleTrigger().getObject(); CronTrigger cronTrigger = cronTrigger().getObject(); bean.setTriggers(simpleTrigger,cronTrigger); return bean; } }

    JobDetail 的配直有两种方式:第一种方式通过 MethodlnvokingJobDetailFactoryBean 类配直 JobDetail,只需要指定 Job 的实例名和要调用的方法即可,注册这种方式无法在创建 JobDetail 时传递参数;第二种方式是通过JobDetailF actoryBean 来实现的,这种方式只需要指定JobClass 即可,然后可以通过 JobDataMap 传递参数到 Job 中, Job 中只需要提供属性名,并且提供一 个相应的 set 方法即可接收到参数。

    • Trigger 有多种不同实现,这里展示两种常用的 Trigger: SimpleTrigger 和 CronTrigger,这两 种 Trigger 分别使用 SimpleTriggerFactoryBean 和 CronTriggerFactoryBean 进行创建。 在 SimpleTriggerFactoryBean 对象中,首先设直 JobDetail,然后通过 setRepeatCount 配直任务 循环次数, setStartDelay 配置任务启动延迟时间, setRepeatlnterval 配直任务的时间间隔。 在 CronTriggerF actory Bean 对象中,则主要配直 JobDetail 和 Cron表达式。

    • 最后通过 SchedulerFactoryBean 创建 SchedulerFactory,然后配直 Trigger 即可。

    Processed: 0.017, SQL: 9