У меня есть приложение Java Spring Boot, в котором есть Планировщик, который вызывает асинхронную задачу из Службы. Задача занимает несколько минут (обычно 3-5 минут).
Тот же самый асинхронный метод из Сервиса также можно вызвать через приложение пользовательского интерфейса, вызвав API из контроллера Boot Spring.
Код:
Планировщик
@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();
}
}
Планировщик запускает асинхронную задачу каждый час, но пользователь также может запускать ее вручную из пользовательского интерфейса.
Но я не хочу, чтобы асинхронный метод запускался снова, если он уже находится в середине выполнения.
Для этого я создал таблицу в БД, которая содержит флаг, который включается при запуске метода, а затем отключается после его завершения.
Как-то так в моем классе обслуживания:
@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 Application, откуда я могу вызвать метод из моего репо, чтобы отменить установку флагов в базе данных?