【发布时间】:2019-09-16 09:29:28
【问题描述】:
我有一个 Java Spring Boot 应用程序,它有一个调度程序,它从服务调用异步任务该任务需要几分钟(通常 3-5 分钟)才能完成。
服务中的相同异步方法也可以通过 UI 应用程序调用,方法是从 Spring Boot Controller 调用 API。
代码:
调度器
@Component
public class ScheduledTasks {
@Autowired
private MyService myService;
@Scheduled(cron = "0 0 */1 * * ?")
public void scheduleAsyncTask() {
myService.doAsync();
}
}
服务
@Service
public class MyService {
@Async("threadTaskExecutor")
public void doAsync() {
//Do Stuff
}
}
控制器
@CrossOrigin
@RestController
@RequestMapping("/mysrv")
public class MyController {
@Autowired
private MyService myService;
@CrossOrigin
@RequestMapping(value = "/", method = RequestMethod.POST)
public void postAsyncUpdate() {
myService.doAsync();
}
}
调度程序每小时运行一次异步任务,但用户也可以从 UI 手动运行它。
但是,如果异步方法已经在执行过程中,我不希望它再次运行。
为了做到这一点,我在 DB 中创建了一个表,其中包含一个标志,该标志在方法运行时打开,然后在方法完成后关闭。
在我的服务类中是这样的:
@Autowired
private MyDbRepo myDbRepo;
@Async("threadTaskExecutor")
public void doAsync() {
if (!myDbRepo.isRunning()) {
myDbRepo.setIsRunning(true);
//Do Stuff
myDbRepo.setIsRunning(false);
} else {
LOG.info("The Async task is already running");
}
}
现在,问题是标志有时会由于各种原因(应用重启、其他一些应用错误等)而卡住
所以,我想在每次部署 Spring Boot 应用程序以及重新启动时重置 DB 中的标志。
我该怎么做?有没有办法在 Spring Boot 应用程序启动后运行一个方法,从那里我可以从我的 Repo 调用一个方法来取消设置数据库中的标志?
【问题讨论】:
标签: java spring spring-boot scheduled-tasks