Нужно ли снова вызывать scheduleAtFixedRate, если исключение правильно перехвачено? - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь запланировать поток в определенное время дня, например, в 4 часа утра, каждый день, перепланируя даже после обнаружения исключения.

У меня был запланирован поток при запуске приложения, перепланирующий самс простым ScheduledThreadPoolExecutor.schedule (новый ThreadItself) в конце его выполнения.Но мне нужно указать начальную задержку для потока.Я знал о scheduleAtFixedDelay / Rate, но по документации он останавливает следующие выполнения потока, если есть исключение.

У меня было это

Внутри MyScheduler

public class MyScheduler{


   public void init(){
      ScheduledThreadPoolExecutor myScheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1);
      myScheduledThreadPoolExecutor.schedule(new MyThread(), delay, TimeUnit.HOURS);
   }

   public void scheduleNextMyThread(int delay){
      myScheduledThreadPoolExecutor.schedule(new MyThread(), delay, TimeUnit.HOURS);
   }

}

Внутри цепочки

public class MyThread extends Thread {

private MyScheduler myScheduler;

public MyThread(Thread scheduler) {
   this.myScheduler = scheduler;
}

@Override
public void run() {
   try {
      // Try Work
   } catch (Exception exc) {
      // Catch Exception
   } finally {
      // Reschedule myself
      myScheduler.scheduleNextMyThread(delay);
   }
}

}

Я пытаюсь перепланировать MyThread в определенное время, используя scheduleAtFixedRate (), чтобы установить начальную задержку и перепланировать себя.

Я закончил тем, что написал это

Inside MyScheduler

myScheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1);

public void scheduleMyThreadAtFixedRate(int delay){

   Calendar cal = Calendar.getInstance(); 
   cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE)+1, 4, 0, 0);
   myScheduledThreadPoolExecutor.scheduleAtFixedRate(new MyThread(), initialDelay, delay, TimeUnit.HOURS);

}

Внутри MyThread

public class MyThread extends Thread {

private Scheduler scheduler;

public MyThread(Thread scheduler) {
   this.scheduler = scheduler;
}

@Override
public void run() {
   try {
      // Try Work
   } catch (Exception exc) {
      // Catch Exception
      // HERE IS MY DOUBT. IS THIS NECESSARY?
      myScheduler.scheduleMyThreadAtFixedRate(delay);
   } 
}

}

Итак ... Возникло исключение.Необходимо ли перепланировать MyThread еще раз внутри блока catch или, поскольку исключения не генерируются, он продолжает свое обычное планирование?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...