以下方案是本人使用定时任务时Service注入失败的解决方案
在 Spring Boot 中执行定时任务时,你可以注入并直接调用 Service 中的方法,就像在普通的业务逻辑中一样。
以下是执行定时任务时调用 Service 的步骤:
创建一个 Service 类,例如:
@Service
public class MyService {
public void doSomeTask() {
// 你的业务逻辑
}
}
创建一个定时任务类,通常实现 org.quartz.Job 接口,并注入你的 Service 类:
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MyScheduledJob implements Job {
@Autowired
private MyService myService;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
myService.doSomeTask();
}
}
在 Spring Boot 应用的配置类中配置定时任务调度器,并关联定时任务类,如下所示:
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class QuartzConfig {
@Bean
public JobDetail myJobDetail() {
return JobBuilder.newJob(MyScheduledJob.class)
.withIdentity("myJob")
.storeDurably()
.build();
}
@Bean
public Trigger myJobTrigger() {
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(60) // 定时任务执行间隔
.repeatForever();
return TriggerBuilder.newTrigger()
.forJob(myJobDetail())
.withIdentity("myTrigger")
.withSchedule(scheduleBuilder)
.build();
}
//@Bean
//public Trigger MemberJobTrigger() {
// SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
// .withIntervalInSeconds(10) // 定时任务执行间隔
// .repeatForever();
//
// return TriggerBuilder.newTrigger()
// .forJob(MemberJobDetail())
// .withIdentity("trigger")
// .withSchedule(scheduleBuilder)
// .build();
//}
@Bean
public Trigger MemberJobTrigger() {
// 使用 CronScheduleBuilder 创建一个每天凌晨0点的触发器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.dailyAtHourAndMinute(0, 0);
return TriggerBuilder.newTrigger()
.forJob(MemberJobDetail())
.withIdentity("trigger")
.withSchedule(scheduleBuilder)
.build();
}
}
配置完成后,定时任务将在每次触发时执行 MyScheduledJob 中的 execute 方法,该方法内部调用 MyService 的方法。
启动 Spring Boot 应用,定时任务会根据配置定时执行 MyService 中的方法。
确保你的 Spring Boot 应用正确配置了定时任务,并且定时任务与 Service 正确关联。根据上述示例,你可以根据自己的需求自定义 Service 中的方法和定时任务的调度策略。