Я реализовал DynamicSupervisor, который обрабатывает работников, использующих Process.send_after/3
для отправки push-уведомлений с некоторой точностью по времени.
В некоторых случаях, например, когда я выпускаю новую версию без функции «горячей замены», я хочу вести учет всех рабочих, еще не завершенных в DETS, и когда DynamicSupervisor снова начинает создавать всех этих рабочих с тем же состоянием, которое было сохранено в DETS.
Я знаю, что DynamicSupervisor не поддерживает работников с самого начала, и я должен внедрить start_child
для запуска нового работника, но не знаю, как я могу интегрировать запуск DynamicSupervisor с начало работы тезисов на одном модуле.
Я пробовал разные подходы, но безуспешно (Task.async
, Process.send_after
и т. Д.).
Должен ли я реализовать начальное поведение в другой части кода (я использую Phoenix)?
РЕДАКТИРОВАТЬ: Я обнаружил небольшую проблему (ожидал% {x: 1, y: 2} и получал [x: 1, y: 2]
Это функция инициализации в DynamicSupervisor.
...
def init(arg) do
Task.async(fn ->
start_lost_children()
end)
DynamicSupervisor.init(arg)
end
def start_child(data) do
spec = {MyApp.Worker, %{data: data}}
DynamicSupervisor.start_child(__MODULE__, spec)
end
...
Это сообщение об ошибке, которое я получаю, хотя и не влияет на поведение DynamicSupervisor.
[error] DynamicSupervisor received unexpected message: {#Reference<0.2565843855.2975858690.212433>, :ok}
[error] DynamicSupervisor received unexpected message: {:DOWN, #Reference<0.2565843855.2975858690.212433>, :process, #PID<0.593.0>, :normal}
:ok
является результатом возврата start_lost_children/0
.
Если я реализую handle_info/2
, он ничего не поймает.