Skip to content

Instantly share code, notes, and snippets.

@sultaniman
Created April 30, 2020 17:35
Show Gist options
  • Save sultaniman/cb61797b61b83de17bcb27f136d33e4d to your computer and use it in GitHub Desktop.
Save sultaniman/cb61797b61b83de17bcb27f136d33e4d to your computer and use it in GitHub Desktop.
How to create dynamic supervisor with registry
# Your actual dynamic worker
defmodule Awesome.Worker do
use GenServer, restart: :transient
alias Awesome.Hero
# Client
def start_link(%Hero{} = hero), do:
GenServer.start_link(@mod, hero, name: proc_name(hero))
defp proc_name(%Hero{name: name}), do:
{:via, Registry, {HeroRegistry, "v-#{name}"}}
end
# Supervisor manages your workers
defmodule Awesome.HeroSupervisor do
use DynamicSupervisor
alias Awesome.Worker
# Client
def start_link(arg), do:
DynamicSupervisor.start_link(@mod, arg, name: @mod)
def join(%Hero{} = hero), do:
DynamicSupervisor.start_child(@mod, {HeroWorker, hero})
# Server
def init(_arg), do:
DynamicSupervisor.init(strategy: :one_for_one)
end
# application.ex
defmodule Awesome.Application do
# ...
def start(_type, _args) do
children = [
{Awesome.HeroSupervisor, []},
{Registry, keys: :unique, name: HeroRegistry}
]
Supervisor.start_link(children, @opts)
end
end
defmodule Awesome.Worker do
use GenServer, restart: :transient
alias Awesome.Hero
# Client
def start_link(%Hero{} = hero), do:
GenServer.start_link(@mod, hero, name: proc_name(hero))
defp proc_name(%Hero{name: name}), do:
{:via, Registry, {HeroRegistry, "v-#{name}"}}
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment