Повторите задачу без сна или блокировки потока

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

Например, предположим, что у меня maxRetryAttempt равно 3, а интервал между повторными попытками равен 3 секундам. У меня есть список задач 1,2, 3,..10 Рабочий поток выбирает задачу 1. Если задача 1 не удалась сейчас, и я хочу повторить ее, но следующая попытка повтора будет через 3 секунды. Здесь я не хочу усыплять свою нить. Вместо этого я хочу поставить задачу в какую-то очередь, и рабочий поток должен выбрать задачу ровно через 3 секунды, чтобы повторить эту задачу.

Я проверил несколько существующих библиотек, таких как spring-retry. Это библиотеки, которые берут работу и переводят поток в спящий режим перед следующей попыткой. Так что все задачи занимают 9 секунд, прежде чем сдаться (предположим, что в худшем случае все задачи не выполняются из-за какой-то проблемы). В этом случае заполняются 10 различных рабочих потоков, и все они ожидают.

Есть ли какая-либо библиотека или шаблон проектирования или идея, которая соответствует моим ожиданиям?


person Raashith    schedule 01.07.2020    source источник
comment
Похоже, вы хотите использовать что-то вроде Timer или Scheduler. Разные фреймворки предлагают разные вариации этой идеи. Я не знаю, как это выглядит в spring-boot, но, возможно, вы можете найти подсказку здесь: spring.io/guides/gs/scheduling-tasks   -  person Solomon Slow    schedule 01.07.2020


Ответы (1)


Вы, вероятно, захотите проверить библиотеку RxJava: http://reactivex.io/

У него есть оператор для асинхронных операций, который делает именно то, что вам нужно: retryWhen

person KUSH42    schedule 01.07.2020