1,创建项目导入以下依赖
org.springframework.boot
spring-boot-starter-web
2.6.1
org.springframework
spring-context-support
2,写任务通过@Scheduled(cron = " ")中的cron来规定我们job什么时候执行。示例如下,还需要我们在主启动类上加@EnableScheduling
/** * 示例 */ @Component public class ScheduledDemo { /** * 定时的job,每三秒执行一次 * 7位: 秒 分 时 日 月 星期 年 * 6位: 秒 分 时 日 月 星期 */ @Scheduled(cron="0/3 * * * * ?") public void spring3ScheduledTest() { System.out.println("执行scheduled定时任务时间:"+ new Date()); } }二,整合Quartz 定时任务框架
1,需要导入依赖如下:
org.quartz-scheduler
quartz
2.2.1
org.springframework
spring-context-support
org.springframework
spring-tx
2,创建定时job的内容示列如下:
public class SpringbootQuartzJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("整合任务开始,时间是:"+ new Date());
}
}
3,创建配置类(不要缺少@Configuration和@Bean注解),主要是是Quartz的JobDetailFactoryBean、SimpleTriggerFactoryBean(CronTriggerFactoryBean)、SchedulerFactoryBean三个对象。
/**
* @author ysy
* 创建我们的JobDetailFactoryBean、SimpleTriggerFactoryBean(CronTriggerFactoryBean)、SchedulerFactoryBean对象
*/
@Configuration
public class ConfigQuartzDemo {
/**
* 创建job是我们的任务,你要去做的事情
* @return JobDetailFactoryBean
*/
@Bean
public JobDetailFactoryBean jobDetailFactoryBean() {
JobDetailFactoryBean jobFactoryBean = new JobDetailFactoryBean();
jobFactoryBean.setJobClass(SpringbootQuartzJob.class);
return jobFactoryBean;
}
/**
* 复杂的触发器,你什么时间去做
* @param jobDetailFactoryBean
* @return
*/
@Bean
public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {
CronTriggerFactoryBean triggerFactoryBean = new CronTriggerFactoryBean();
triggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject());
triggerFactoryBean.setCronExpression("0/2 * * * * ?");
return triggerFactoryBean;
}
/**
* 简单的 触发器 ,你什么时间去做
* @param jobDetailFactoryBean
* @return SimpleTriggerFactoryBean
*/
// @Bean
// public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {
// SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
// factoryBean.setJobDetail(jobDetailFactoryBean.getObject());
// 多久执行一次,2秒
// factoryBean.setRepeatInterval(2000);
// 每2秒执行一次个任务,执行5次后就不执行了
// factoryBean.setRepeatCount(5);
// return factoryBean;
// }
/**
* scheduled调度器:调度什么时候去做什么事情
* @param cronTriggerFactoryBean
* @return schedulerFactoryBean
*/
@Bean
public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean cronTriggerFactoryBean,MyAdaptableJobfactory myAdaptableJobfactory) {
SchedulerFactoryBean schedulerFactoryBean =new SchedulerFactoryBean();
schedulerFactoryBean.setTriggers(cronTriggerFactoryBean.getObject());
schedulerFactoryBean.setJobFactory(myAdaptableJobfactory);
return schedulerFactoryBean;
}
}
如果要通过@Autowired注入我们的对象如下注入我们UserService中的一个addUser方法,如果直接执行的话会报一个java.lang.NullPointerException: null异常。需要我们重写AdaptableJobFactory中的createJobInstance方法,加入到spring容器中(不重写是通过反射来实现的没有加入我们spring容器)。
/**
* @author ysy
*/
@Service
public class UserService {
public void addUser() {
System.out.println("hello,定时注入成功!");
}
}
/**
* @author ysy
*/
public class SpringbootQuartzJob implements Job {
@Autowired
private UserService userService;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("整合任务开始,时间是:"+ new Date());
this.userService.addUser();
}
}
重写createJobInstance方法如下:
/**
* @author ysy
*/
@Component
public class MyAdaptableJobfactory extends AdaptableJobFactory {
// 手动注入到我们的spring容器中
@Autowired
private AutowireCapableBeanFactory autowireCapableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
Object jobInstance = super.createJobInstance(bundle);
// 注入到spring容器中
autowireCapableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
运行每2秒执行一次结果:
2022-04-24 00:21:41.727 INFO 21728 --- [ main] s.SpringbootQuartzIntegrationApplication : Started SpringbootQuartzIntegrationApplication in 0.646 seconds (JVM running for 1.278)
整合任务开始,时间是:Sun Apr 24 00:21:42 CST 2022
hello,定时注入成功!
整合任务开始,时间是:Sun Apr 24 00:21:44 CST 2022
hello,定时注入成功!
整合任务开始,时间是:Sun Apr 24 00:21:46 CST 2022
hello,定时注入成功!
Process finished with exit code -1
简单的任务可以用scheduled,复杂的可以用Quartz。如有错误,或者不足欢迎留言哈!希望能帮到你,祝你工作顺利!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)