У меня есть довольно стандартный механизм в Java для решения проблемы:
- Рабочие элементы должны быть запланированы для выполнения в определенное время
- Затем каждый рабочий элемент должен ожидать, когда условие станет истинным.
- Рабочие элементы должны быть отменяемыми
Я использую следующее решение:
- Иметь однопоточный планировщик для планирования моих рабочих элементов
- Иметь
ExecutorService
(который может быть многопоточным) - Затем каждый запланированный рабочий элемент отправляет фактическую работу в
ExecutorService
. ВозвращенныйFuture
кэшируется на карте. Служба завершения используется для удаления будущего из кеша, когда работа завершена. - Элементы могут быть отменены через кешированные фьючерсы
Конечно, мой исполнитель должен быть не меньше ожидаемого количества блокирующих рабочих элементов, но на практике это не проблема.
Итак, теперь я пишу код на Scala и использую фреймворк акторов. Предполагая, что мой рабочий элемент может быть инкапсулирован в событие, отправленное актеру:
- Какой механизм я бы использовал для планирования рабочего элемента на определенное время?
- Если рабочий элемент — это событие, отправляемое действующему лицу, как я могу гарантировать, что пул резервных потоков больше, чем количество элементов, которые могут быть заблокированы одновременно?
- Как я могу отменить ранее запланированный рабочий элемент?