chattes
Dynamic Supervisor Fails to Start GenServer
Hello Experts,
I am just starting to play with Supervisors and I have created the Project using mix new podder --sup
I get the Following error when I try to Invoke a Process using the Dynamic Supervisor.
This is my code.
I am using Elixir 1.7.3.
Applicaiton.ex
defmodule Podder.Application do
# See https://hexdocs.pm/elixir/Application.html
# for more information on OTP Applications
@moduledoc false
use Application
def start(_type, _args) do
# List all child processes to be supervised
children = [
# Starts a worker by calling: Podder.Worker.start_link(arg)
# {Podder.Worker, arg},
%{
id: Podder.DynamicSupervisor,
start: {Podder.DynamicSupervisor, :start_link, []}
}
]
# See https://hexdocs.pm/elixir/Supervisor.html
# for other strategies and supported options
opts = [strategy: :one_for_one, name: Podder.DynamicSupervisor]
Supervisor.start_link(children, opts)
end
end
Supervisor
defmodule Podder.DynamicSupervisor do
use DynamicSupervisor
def start_link() do
DynamicSupervisor.start_link(__MODULE__, :ok, name: __MODULE__)
end
@doc """
Server Side
"""
def init(_arg) do
DynamicSupervisor.init(strategy: :one_for_one)
end
def start_work do
{:ok, pid} = start_podcast_server
end
defp start_podcast_server do
spec = %{id: Podder, start: {Podder, :start_link, []}}
DynamicSupervisor.start_child(__MODULE__, spec)
end
end
GenServer
defmodule Podder do
use GenServer
@moduledoc """
Documentation for Podder.
"""
@doc """
Hello world.
## Examples
iex> Podder.hello()
:world
"""
def init(state) do
{:ok, state}
end
def handle_call(:fetch, _from, state) do
new_state = Map.put(state, "fetched", 1)
{:reply, new_state, new_state}
end
def handle_call(:get_state, _from, state) do
{:reply, state, state}
end
@doc """
Client Implementation
"""
def start_link(state) do
GenServer.start_link(__MODULE__, state)
end
def fetch_episodes(pid) do
GenServer.call(pid, :fetch)
end
def get_episodes(pid) do
GenServer.call(pid, :get_state)
end
end
I am trying this from iex
iex(4)> Podder.DynamicSupervisor.start_work
** (MatchError) no match of right hand side value: {:error, {:invalid_child_spec, {{Podder, :start_link, []}, :permanent, 5000, :worker, [Podder]}}}
(podder) lib/podcastsupervisor.ex:16: Podder.DynamicSupervisor.start_work/0
iex(4)>
Marked As Solved
saulecabrera
I tried replicating your code in a new mix project, may I ask how are you starting iex?
I tried running iex -S mix and the application is not even able to start because the current code is registering two processes with the same name (Podder.DynamicSupervisor), one for the top level supervisor and another for the actual DynamicSupervisor:
def start(_type, _args) do
children = [
%{
id: Podder.DynamicSupervisor, #Here
start: {Podder.DynamicSupervisor, :start_link, []}
}
]
opts = [strategy: :one_for_one, name: Podder.DynamicSupervisor] #Here
Supervisor.start_link(children, opts)
end
The name for the top level supervisor is normally omitted, unless you actually need it:
opts = [strategy: :one_for_one] #Here
Supervisor.start_link(children, opts)
With those changes I was able to succesfully call Podder.DynamicSupervisor.start_work
Also Liked
david_ex
Have you tried
defp start_podcast_server do
spec = DynamicSupervisor.child_spec({Podder, %{}}, id: Podder)
DynamicSupervisor.start_child(__MODULE__, spec)
end
Typically, I think providing a child spec “by hand” is asking for trouble. If you’re interested, I’ve covered child specs and dynamic supervisors in more depth at http://davidsulc.com/blog/2018/07/10/pooltoy-a-toy-process-pool-manager-in-elixir-1-6-part-1-9/
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance









