Hello friends, I think I am creating a bad config for my project.
I have a genserver
is started under DynamicSupervisor
and I start it with PartitionSupervisor
my Application config:
def start(_type, _args) do
children = [
{Registry, keys: :unique, name: MishkaJobWorkerRegistry},
{PartitionSupervisor, child_spec: DynamicSupervisor, name: MishkaJobWorkerSupervisor},
]
opts = [strategy: :one_for_one, name: MishkaInstaller.Supervisor]
Supervisor.start_link(children, opts)
end
It is my Genserver simple code:
defmodule Queue.Job do
use GenServer
require Logger
def start_link(args) do
id = Map.get(args, :worker)
type = Map.get(args, :type, :normal)
GenServer.start_link(__MODULE__, [], name: via(id, type))
end
@impl true
def init(state \\ %{}) do
{:ok, state}
end
@doc false
def child_spec(process_name) do
%{
id: __MODULE__,
start: {__MODULE__, :start_link, [process_name]},
restart: :transient,
max_restarts: 4
}
end
defp via(id, value) do
{:via, Registry, {MishkaJobWorkerRegistry, id, value}}
end
end
and I start like this:
def start_job_worker(args) do
DynamicSupervisor.start_child(
{:via, PartitionSupervisor, {MishkaJobWorkerSupervisor, self()}},
{Queue.Job, args}
)
end
But if my genserver crashes unexpectedly, it does not reset it and when I check the process of my genserver , it returns false.
Another problem is
when I use this to terminate one of genserver by pid
, it returns not found
DynamicSupervisor.terminate_child(MishkaJobWorkerSupervisor, pid)
Where I am creating a bug?
Thank you in advance