Как получить результаты выполнения из ThreadPoolTaskScheduler ⇐ JAVA
-
Anonymous
Как получить результаты выполнения из ThreadPoolTaskScheduler
В моем приложении я извлекаю из базы данных некоторые метаданные и на их основе создаю экземпляр класса MyJob, реализующий интерфейс Runnable, а затем отправляю его в ThreadPoolTaskScheduler. Мое задание выполняется как положено, но мне нужно обработать результаты его завершения или сбоя. Т.е. если количество выполнений превышает лимит, указанный в метаданных, мне нужно отменить последующие выполнения. Мне также нужно обновить базу данных, добавив некоторые результаты, хранящиеся в экземпляре MyJob. Если работа не удалась, мне нужно проанализировать причину неудачи. Если это произошло из-за временного сбоя, я позволю заданию запуститься снова, в противном случае мне также придется отменить его.
Итак, я увидел, что ThreadPoolTaskScheduler имеет этот защищенный метод
afterExecute (Запускаемая задача, @Nullable Throwable ex) и подумал, что это может решить мою проблему. Я написал класс MyJobScheduler, расширяющий ThreadPoolTaskScheduler, и перегрузил этот метод следующим кодом:
@Override protected void afterExecute (Выполняемая задача, Throwable ex) { super.afterExecute(задача, бывший); если (ex == ноль) { MyJubRunner бегун = (MyJobRunner) задача; MyJob job = runner.getJob(); // все, что мне нужно с этим сделать } еще { // анализируем исключение } } Я поместил точку останова внутри этой функции и обнаружил, что она вызывается дважды до и после выполнения задания. Во-вторых, я получил ClassCastException, потому что Runnable, который эта функция получает в качестве параметра, - это не моя задача, а экземпляр java.util.concurrent.ScheduledThreadPoolExecutor. $ScheduledFutureTask. Я попытался выполнить собственное сопоставление между экземпляром MyJob и ScheduledFuture, полученным при отправке моего задания планировщику, но обнаружил, что этот параметр получен afterExecute Функция не имеет ничего общего с упомянутым выше экземпляром ScheduledFuture.
Моя заявка может обрабатывать десятки заданий одновременно, и мне нужно выяснить, какое из них завершено и как.
Мой вопрос вполне ясен: можно ли узнать, какая задача была выполнена из метода afterExecute. Если можно - как это сделать. Если нет, то какой другой способ контролировать выполнение запланированных заданий? Если кто-то поможет мне это выяснить, я буду очень признателен.
В моем приложении я извлекаю из базы данных некоторые метаданные и на их основе создаю экземпляр класса MyJob, реализующий интерфейс Runnable, а затем отправляю его в ThreadPoolTaskScheduler. Мое задание выполняется как положено, но мне нужно обработать результаты его завершения или сбоя. Т.е. если количество выполнений превышает лимит, указанный в метаданных, мне нужно отменить последующие выполнения. Мне также нужно обновить базу данных, добавив некоторые результаты, хранящиеся в экземпляре MyJob. Если работа не удалась, мне нужно проанализировать причину неудачи. Если это произошло из-за временного сбоя, я позволю заданию запуститься снова, в противном случае мне также придется отменить его.
Итак, я увидел, что ThreadPoolTaskScheduler имеет этот защищенный метод
afterExecute (Запускаемая задача, @Nullable Throwable ex) и подумал, что это может решить мою проблему. Я написал класс MyJobScheduler, расширяющий ThreadPoolTaskScheduler, и перегрузил этот метод следующим кодом:
@Override protected void afterExecute (Выполняемая задача, Throwable ex) { super.afterExecute(задача, бывший); если (ex == ноль) { MyJubRunner бегун = (MyJobRunner) задача; MyJob job = runner.getJob(); // все, что мне нужно с этим сделать } еще { // анализируем исключение } } Я поместил точку останова внутри этой функции и обнаружил, что она вызывается дважды до и после выполнения задания. Во-вторых, я получил ClassCastException, потому что Runnable, который эта функция получает в качестве параметра, - это не моя задача, а экземпляр java.util.concurrent.ScheduledThreadPoolExecutor. $ScheduledFutureTask. Я попытался выполнить собственное сопоставление между экземпляром MyJob и ScheduledFuture, полученным при отправке моего задания планировщику, но обнаружил, что этот параметр получен afterExecute Функция не имеет ничего общего с упомянутым выше экземпляром ScheduledFuture.
Моя заявка может обрабатывать десятки заданий одновременно, и мне нужно выяснить, какое из них завершено и как.
Мой вопрос вполне ясен: можно ли узнать, какая задача была выполнена из метода afterExecute. Если можно - как это сделать. Если нет, то какой другой способ контролировать выполнение запланированных заданий? Если кто-то поможет мне это выяснить, я буду очень признателен.
Мобильная версия