Как получить ScheduledExecutorService для продолжения выполнения других последующих задач, когда одна задача выдает исключение - PullRequest
0 голосов
/ 26 января 2019

У меня есть исполнитель, который выполняет задачу каждые 5 секунд

public class ScheduledTaskExecutor {

  public int execute(){
    ScheduledExecutorService executor = Executors.newScheduledThreadPool(4);
    executor.scheduleAtFixedRate(new Task().run,3,5, TimeUnit.SECONDS);
    return -1;
  }

}

Вот задача.Я выбрасываю IllegalArgumentException, если X == 4

public class Task {

    private static final Logger LOG = LoggerFactory.getLogger(DcEmailTask.class);
    private int x = 0;


    public Runnable run = () -> {
        String currentThread = Thread.currentThread().getName();
        x++;
        System.out.println("Thread [" + currentThread + "] is executing the task: " + x);
        if (x == 4) throw new IllegalArgumentException();
    };

}

Программа прекращает выполнение, и трассировка стека не печатается.

Ответы [ 2 ]

0 голосов
/ 26 января 2019
  1. Реализация интерфейса ScheduledExecutorService (SESWrrapper), который принимает другой ScheduledExecutorService в своем конструкторе.
  2. Реализация интерфейса Runnable (SafeRunnableWrapper), который принимает другой Runnable в своем конструкторе и захватывает исключения внутри его метода run ().
  3. Реализация интерфейса Callable (SafeCallableWrapper), как указано выше.
  4. В SESWrrapper. (Runnable, long, TimeUnit) методы оборачивают Runnable с SafeRunnableWrapper и вызывают вложенный ScheduledExecutorService.schedule ().
0 голосов
/ 26 января 2019

Это поведение в соответствии с javadoc ScheduledExecutorService#scheduleAtFixedRate. Один из способов решения проблемы - перехват всех исключений в runnable.

Этот ответ содержит более подробную информацию https://stackoverflow.com/a/24902026/3002471

...