[英]Repository is null in job scheduling in spring boot with quartz scheduler
當用戶調用api /bet/{id}/start時,會立即創建name = id, group = Exchanges的Schedule,每分鍾3秒自動調用excute函數進行處理,比如這里我會調用repository的findById(id)函數來檢索和處理數據,但是得到的結果是java.lang.NullPointerException: null
投注控制器.java
@RestController
@RequestMapping("/api")
@Transactional
public class BetController extends AbstractController {
private MainScheduler mainScheduler;
@RequestMapping(value = "/bet/{id}/start", method = RequestMethod.POST)
public String addAndStartScheduleWithBetId(@PathVariable("id") Long id) {
mainScheduler.addAndStartScheduler(""+id);
return "";
}
}
主調度程序
@Service
public class MainScheduler {
private Scheduler scheduler;
public MainScheduler(Scheduler scheduler) {
this.scheduler = scheduler;
}
public Scheduler addAndStartScheduler(String betId) {
try {
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(betId,"Exchanges").withSchedule(CronScheduleBuilder.cronSchedule("3 * * ? * * *")).build();
JobDetail jobDetail = JobBuilder.newJob(ScheduleJob.class).withIdentity(betId, "Exchanges") .build();
scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail, trigger);
System.out.println(jobDetail.getKey() + ","+ trigger.getKey() + " will run at: " + new Date());
} catch(Exception ex) {
System.out.println(ex);
}
return scheduler;
}
public boolean deleteJobDetail(String name) {
boolean flag = false;
try {
flag = scheduler.deleteJob(jobKey(name, "Exchanges"));
} catch (SchedulerException e) {
e.printStackTrace();
}
return flag;
}
}
BetRepository.java
public interface BetRepository extends CrudRepository<Bet, Long> {
Page<Bet> findAll(Pageable pageable);
Optional<Bet> findById(Long id) ;
}
調度作業.java
public class ScheduleJob implements Job{
@Autowired
private BetRepository betRepository;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// TODO Auto-generated method stub
System.out.println("key+group trigger: " + context.getTrigger().getKey());
Long id = Long.parseLong(context.getJobDetail().getKey().getName());
System.out.println("Bet repositorys: " + betRepository.findById(id));
}
}
13-07-2021 03:33:03.015 [35m[DefaultQuartzScheduler_Worker-3][0;39m
[1;31mERROR[0;39m
org.quartz.core.ErrorLogger.schedulerError - Job (Exchanges.5 threw an exception.
org.quartz.SchedulerException: Job threw an unhandled exception.
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
Caused by: java.lang.NullPointerException: null
at com.bot.auto.utils.ScheduleJob.execute(ScheduleJob.java:21)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
... 1 common frames omitted
修改您的 MainScheduler 以便您獲得自動裝配的 BetRepository 並將其放入調度程序上下文中,然后再啟動調度程序並將其放入作業中。
@Service
public class MainScheduler {
private Scheduler scheduler;
@Autowired
private BetRepository betRepository;
public MainScheduler(Scheduler scheduler) {
this.scheduler = scheduler;
}
public Scheduler addAndStartScheduler(String betId) {
try {
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(betId,"Exchanges").withSchedule(CronScheduleBuilder.cronSchedule("3 * * ? * * *")).build();
JobDetail jobDetail = JobBuilder.newJob(ScheduleJob.class).withIdentity(betId, "Exchanges") .build();
scheduler = StdSchedulerFactory.getDefaultScheduler();
schduler.getContext().put("betRepo",betRepository);
scheduler.start();
scheduler.scheduleJob(jobDetail, trigger);
System.out.println(jobDetail.getKey() + ","+ trigger.getKey() + " will run at: " + new Date());
} catch(Exception ex) {
System.out.println(ex);
}
return scheduler;
}
< -----other methods as is---->
}
更改您的工作類別如下
公共類 ScheduleJob 實現 Job{
private BetRepository betRepository;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// TODO Auto-generated method stub
betRepository= context.get("betRepo"); or context.getScheduler().getContext().get("betRepo");
System.out.println("key+group trigger: " + context.getTrigger().getKey());
Long id = Long.parseLong(context.getJobDetail().getKey().getName());
System.out.println("Bet repositorys: " + betRepository.findById(id));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.