public JxMjkhTxController() { } public JxMjkhTxController(ScheduledExecutorService scheduledExecutorService, JxMjKhTxService jxMjKhTxService, ConstantProperties constantProperties) { this.scheduledExecutorService = scheduledExecutorService; this.jxMjKhTxService = jxMjKhTxService; this.constantProperties = constantProperties; } @PostConstruct public void init() { System.out.println("=====================================init-start========================"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); scheduledExecutorService.scheduleAtFixedRate(() -> { try { new SaveResultTask(jxMjKhTxService, constantProperties).run(); } catch (Exception e) { e.printStackTrace(); log.error(e.getMessage()); } }, 0, 10, TimeUnit.MINUTES); } @GetMapping("/saveTxData") public List<Map<String, Object>> getResult() throws Exception { System.out.println("开始查询提醒接口数据"); return jxMjKhTxService.selectJxMjkhTxData(constantProperties.getJsbh()); }为什么我的定时任务定时跑的数据不对,但是我重启服务再跑数据就正确了,如何解决 详细代码解决
时间: 2023-08-06 20:19:48 浏览: 95
几种定时任务(Timer、TimerTask、ScheduledFuture)的退出—结合真实案例【JAVA并发】.docx
从您提供的代码看,定时任务是在项目启动时就开始执行了。如果在数据还没初始化完成时就开始执行,那么定时任务执行的结果就会不正确。您可以尝试通过以下方式解决:
1. 将定时任务的执行时间延后一段时间,比如将初始延迟时间设置为1分钟,然后再执行定时任务,以确保数据已经初始化完成。
2. 在定时任务中加入一些日志输出,以便您更好地定位问题所在。
3. 另外,您可以通过修改定时任务的执行方式,让定时任务在第一次执行时等待数据初始化完成后再开始执行。例如,可以在定时任务中加入一些判断逻辑,如果数据还没有初始化完成,则等待一段时间后再执行定时任务。
以下是修改后的代码,供您参考:
```
public JxMjkhTxController() { }
public JxMjkhTxController(ScheduledExecutorService scheduledExecutorService, JxMjKhTxService jxMjKhTxService, ConstantProperties constantProperties) {
this.scheduledExecutorService = scheduledExecutorService;
this.jxMjKhTxService = jxMjKhTxService;
this.constantProperties = constantProperties;
}
@PostConstruct
public void init() {
System.out.println("=====================================init-start========================"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
scheduledExecutorService.schedule(() -> {
while (true) {
if (dataIsInitialized()) {
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
scheduledExecutorService.scheduleAtFixedRate(() -> {
try {
new SaveResultTask(jxMjKhTxService, constantProperties).run();
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage());
}
}, 0, 10, TimeUnit.MINUTES);
}, 1, TimeUnit.MINUTES);
}
private boolean dataIsInitialized() {
// 判断数据是否已经初始化完成,如果是,则返回true,否则返回false
// 这里可以根据具体业务逻辑来实现
return true;
}
@GetMapping("/saveTxData")
public List<Map<String, Object>> getResult() throws Exception {
System.out.println("开始查询提醒接口数据");
return jxMjKhTxService.selectJxMjkhTxData(constantProperties.getJsbh());
}
```
阅读全文