Как получить результаты выполнения из ThreadPoolTaskSchedulerJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как получить результаты выполнения из ThreadPoolTaskScheduler

Сообщение Anonymous »


В моем приложении я извлекаю из базы данных некоторые метаданные и на их основе создаю экземпляр класса 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. Если можно - как это сделать. Если нет, то какой другой способ контролировать выполнение запланированных заданий? Если кто-то поможет мне это выяснить, я буду очень признателен.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»