как получить некоторые бизнес-параметры в rejectedExecution?

#java #threadpoolexecutor

#java #threadpoolexecutor

Вопрос:

Многопоточность Java выполняет задачи и явно конструирует ThreadPoolExecutor , как показано ниже

 final ExecutorService threadPool = new ThreadPoolExecutor(nThreads, nThreads,
                0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<>(1), myRejectedExecutionHandler);
 

и отправляйте задачи следующим образом

 for (int i = 0; i < count; i  ) {
    int articleId = i;
    CompletableFuture.supplyAsync(() -> articleId, threadPool);

}
 

теперь я хочу настроить rejectedExecutionHandler

 void rejectedExecution(Runnable r, ThreadPoolExecutor executor);
 

но как я могу получить articleId? потому что я хочу зарегистрировать отклоненный articleId, rejectedExecution например

 log.warn("article: {} is rejected, please process it manually", articleId);
 

Ответ №1:

Мое решение: не использовать пользовательский RejectedExecutionHandler и перехватить исключение RejectedExecutionException

 catchRejectedException(()->CompletableFuture.supplyAsync(() -> articleId, threadPool), articleId);

private void catchRejectedException(Runnable task, int articleId) {
    try {
        task.run();
    } catch (RejectedExecutionException e) {
        log.error("article: {} is rejected", articleId, e);
    }
}