GenServer child_spec/1 in Elixir 1.5
Elixir 1.5 GenServer introduces overridable child_spec/1. Now instead of, in your application supervisor, calling;
# MyExample.Application
def start(_type, _args) do
children = [
worker(MyExample.MyChild, [], restart: :permanent, shutdown: 5000)
]
end
You can now let the child decide how its supposed to be implemented by overriding child_spec/1
in the child.
#MyExample.Application
def start(_type, _args) do
children = [
MyExample.MyChild
]
end
# MyExample.MyChild
def child_spec(_args) do
%{
id: __Module__,
start: { __Module__, :start_link, []},
restart: :permanent,
shutdown: 5000,
type: :worker
}
end
You can view the defaults that child_spec/1
implements in the source code.
Arguments can be passed to child_spec/1
which can then be used for pattern matching and custom configurations based on the supervisor accessing it:
#MyExample.Application
def start(_type, _args) do
children = [
{MyExample.MyChild, "temporary"}
]
end
# MyExample.MyChild
def child_spec("temporary") do
%{
id: __Module__,
start: { __Module__, :start_link, []},
restart: :temporary,
shutdown: 5000,
type: :worker
}
end
def child_spec(_) do
%{
id: __Module__,
start: { __Module__, :start_link, []},
restart: :permanent,
shutdown: 5000,
type: :worker
}
end
Tweet