前言需求描述
其实在实际的工程开发过程中,使用定时任务的是难以避免的一种情况,其实SpringBoot 的里面自带的定时任务比较好用,特别简单,但是有个问题就是这个太容易冲突了,管理不方便,如果定时任务少的话可以使用的。多的话不建议使用这个,多的话,使用XXjob或者Quartz 定时任务框架比较好一些!
1、简单说下Cron表达式
2、在线测试Cron表达式是否合规范可运行
3、参考周五周末定时表达式的写法
4、SpringBoot定时器的使用java代码
主要的java代码比较简单可以直接注解使用
在当前的bean注入就可以的
@Component
public class NewsRetryJob {
@Scheduled(cron = "${app.job.news-retry-job.cron: 0 0 0/8 * * ?}") public void retrySendNews() { 业务逻辑处理 }
}
主要类似上面的结构就可以的。
5、主要问题
使用这个很容易会导致冲突,目前我写的这个定时器任务就三个所有这个不会有冲突,定时器设置的是每隔一些质数,7,9,13分钟执行一次。避免冲突,因为cron表达式只要冲突的话,是直接跳过的。只会随机执行其中的一个,这个是业务以及发现了的,所以这个在复杂业务场景的情况下不建议这个使用。
6、SpringBoot插入Quartz 定时器
SpringBoot里面启动的时候需要开启这个定时任务
@SpringBootApplication
@EnableScheduling
public class WebApplication {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class, args);
}
}
1、QuartzConfig
创建Job对象
@Configuration
public class QuartzConfig {
/*** 1.创建 Job 对象 */
@Bean
public JobDetailFactoryBean jobDetailFactoryBean() {
JobDetailFactoryBean factory = new JobDetailFactoryBean();
//关联我们自己的 Job 类
factory.setJobClass(QuartzDemo.class);
return factory;
}
/*** 2(已不建议在使用这个简单地触发器).创建 Trigger 对象 * 简单的 Trigger( 仅能设置简单的定时任务,不支持cron表达式,最开始这么使用的,后来作废了) */
@Bean
public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {
SimpleTriggerFactoryBean factory = new SimpleTriggerFactoryBean();
//关联 JobDetail 对象
factory.setJobDetail(jobDetailFactoryBean.getObject());
//该参数表示一个执行的毫秒数
factory.setRepeatInterval(2000);
// 重复次数 factory.setRepeatCount(5);
return factory;
}
/*** 2、Cron Trigger 超级推荐使用功能的是这个,目前业务复杂度提高之后,这个目前是主要在使用这个功能*/
@Bean
public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {
CronTriggerFactoryBean factory = new CronTriggerFactoryBean();
factory.setJobDetail(jobDetailFactoryBean.getObject());
//设置触发时间
factory.setCronExpression("0/2 * * * * ?");
return factory;
}
/*** 3.创建 Scheduler 对象 */
@Bean
public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean cronTriggerFactoryBean, MyAdaptableJobFactory myAdaptableJobFactory) {
SchedulerFactoryBean factory = new SchedulerFactoryBean();
//关联trigger
factory.setTriggers(cronTriggerFactoryBean.getObject());
factory.setJobFactory(myAdaptableJobFactory);
return factory;
}
}
7、一个定时任务简单地实现
import org.apache.commons.collections4.CollectionUtils;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
@Component
@DisallowConcurrentExecution
public class EventGenerateJob implements Job {
@Autowired
private TbmEventConfigDao tbmEventConfigDao;
@Autowired
private TbmEventTagConfigDao tbmEventTagConfigDao;
@Autowired
private EventService eventService;
@Autowired
private TbmEventExtendConfigDao tbmEventExtendConfigDao;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
List<TbmEventConfig> eventConfigList = tbmEventConfigDao.getAll();
for (TbmEventConfig item : eventConfigList) {
List<TbmEventTagConfig> tagConfigList = tbmEventTagConfigDao.selectByEventId(item.getId());
if (CollectionUtils.isEmpty(tagConfigList)) {
continue;
}
List<TbmEventExtendConfig> eventExtendConfigList = tbmEventExtendConfigDao.selectByEventId(item.getId());
try {
eventService.buildEventInfo(item, tagConfigList,eventExtendConfigList);
} catch (ApiException e) {
// log.error("EventGenerateJob executeInternal() failed!event_no=" + item.getEventNo());
e.printStackTrace();
}
}
}
}
8、具体的实现可以参考
QrtzManager添加监听器定时任务执行_道阻且长-行则将至-行而不辍-未来可期的博客-CSDN博客
QuartzServiceImpl实现管理Quartz接口_道阻且长-行则将至-行而不辍-未来可期的博客-CSDN博客_quartz 接口
实际项目中quartz的应用定时器操作Spring注入 quartz.spi.TriggerFiredBundle 触发器管理定时任务_道阻且长-行则将至-行而不辍-未来可期的博客-CSDN博客