I have a named Supervisor
that supervises many simple_one_for_one
workers, which perform a task at regular intervals for each user on my system.
I want the app to start one worker for each user when the Supervisor
starts for the first time, and I want the app to do the same if the Supervisor
restarts at a later date, for whatever reason.
At the moment I start all the children dynamically in the Application
's start(type, args)
callback, but if the Supervisor
is restarted, that won't start all the child processes.
How do I ensure all the dynamic child workers are started immediately after the Supervisor
starts/restart, at any time?
(My app is in Elixir, but the same principles apply to Erlang.)
One way I've done this that works pretty well is to use another supervisor and a "restart worker". Your supervisor is a child of the new one -- it's a sibling of the restart worker. The new supervisor uses one_for_all
or rest_for_one
, so that if your supervisor dies, the restart worker is also restarted.
When the restart worker is restarted, it can start the dynamic workers.