prefácio
Use o Quartz para implementar uma tarefa de temporização configurável e grave a tarefa de temporização Quartz no banco de dados. Agora eu quero acionar automaticamente a tarefa agendada assim que o projeto for iniciado, o seguinte é o método de implementação:
Inicialização automática do projeto
O Spring Boot usa o ApplicationRunner para implementar operações de negócios diretamente após a inicialização do projeto.
Este blog descreve em detalhes a implementação de operações de negócios automáticas após a inicialização do projeto. Precisamos apenas adicionar a interface do método chamada pela tarefa agendada no método run.
log.info("启动定时任务");
quartzService.startQuartz();
Início de tarefa agendada
Obtenha informações de tarefas agendadas do banco de dados
public void startQuartz(){
String jobGroup ="MySyncTask";
String jobName ="定时人数";
try {
//先已有的任务
List<Quartz> list = quartzMapper.findList(jobGroup, jobName);
if(list != null && list.size()>0){
log.info("项目启动后,启动定时任务:{}",list.get(0).getJobName());
doQuatrz(list.get(0));
}
}catch (Exception e){
e.printStackTrace();
log.error("项目启动后,启动定时任务发生异常:{}",e.getMessage());
API.e("项目启动后,启动定时任务发生异常");
}
}
Consulta e gatilho de tarefa cronometrada
private void doQuatrz(Quartz quartz){
try {
//直接启动
Class cls = Class.forName(quartz.getJobClassName()) ;
cls.newInstance();
//构建job信息
JobDetail job = JobBuilder.newJob(cls).withIdentity(quartz.getJobName(),quartz.getJobGroup()).withDescription(quartz.getDescription()).build();
// 触发时间点
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(quartz.getCronExpression());
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger_"+quartz.getJobName(), quartz.getJobGroup()).withDescription(quartz.getDescription()).startNow().withSchedule(cronScheduleBuilder).build();
//交由Scheduler安排触发
scheduler.scheduleJob(job, trigger);
quartz.setJobStatus(JobStatus.RUN.getStatus());
quartzRepository.save(quartz);
}catch (Exception e){
e.printStackTrace();
log.error("执行任务发生异常:{}",e.getMessage());
API.e("执行任务发生异常");
}
}