Возникает вопрос: есть ли feasibile метод, чтобы быть уверенным, что метод не будет до бесконечности заблокирован (waybe ждет ресурса, или что-то еще)?
Если планирование не может быть запланировано с точным регулярным интервалом, возможно, вы не можете использовать фиксированную задержку, но использовать два условия: задержка + последнее выполнение.
Вы можете запланировать задачу, которая проверяет выполнение двух условий, и если это так, вы выполняете важную обработку. В противном случае он ждет следующего графика.
Таким образом, вы не должны блокироваться. Вы можете подождать некоторое время, если задача превысит фиксированную задержку. Если это проблема, потому что фиксированная задержка часто превышается, вам, вероятно, не следует использовать фиксированную задержку или, следовательно, вы должны повысить ее чувствительность, чтобы она была менее распространена.
Вот пример (запись без редактора Извините, если какая-то ошибка.):
private boolean isLastImportDataTaskFinished;
@Scheduled(fixedDelay = 300000)
public void importDataTaskManager(){
if (isLastImportDataTaskFinished()){
new Thread(new ImportantDataProcessing())).start();
}
else{
// log the problem if you want
}
}
private isLastImportDataTaskFinished(){
// to retrieve this information, you can do as you want : use a variable
// in this class or a data in database,file...
// here a simple implementation
return isLastImportDataTaskFinished;
}
Runnable класс:
public class ImportantDataProcessing implements Runnable{
public void run(){
importData(); //db calls, file manipulations, etc..
}
}
Комментарий:
Но если я бегу это как нить, как я могу убить его, если я нахожу, что он превышает лимит времени, так как у меня нет ссылки на него (в идее с использованием второй задачи для определения застрявшего состояния)?
Вы можете использовать ExecutorService (у вас есть вопрос об этом здесь: How to timeout a thread).
Вот очень простой пример:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future future = executor.submit(new ImportantDataProcessing());
try {
future.get(100, TimeUnit.SECONDS);
}
catch (InterruptedException e) {
e.printStackTrace();
}
catch (ExecutionException e) {
e.printStackTrace();
}
catch (TimeoutException e) {
// the timeout to handle but other exceptions should be handled :)
e.printStackTrace();
}
executor.shutdown();
Если интересная информация может быть возвращена ImportantDataProcessing
обработки, вы можете использовать задачу вместо работоспособных например ввести в будущее.
Нахождение тупика будет лучшим подходом, мы не знаем, где его поражают. поэтому я сомневаюсь, что мы можем предоставить идеи для исправления. –