我正在嘗試爲調度程序應用程序(使用Elixir 1.5語法註釋)設置監督樹。該應用程序應該工作,使:如何將參數傳遞給:simple_one_for_one GenServer以初始化狀態
- 應用程序啓動使用註冊表&調度監督員
- 的SchedulerSupervisor靴,並允許通過
start_child
回調動態添加的兒童。這需要用於構建調度狀態的初始化參數。 - 調度程序在初始化時將其名稱註冊到註冊中心,並使用一個包含狀態的結構進行初始化(調度程序具有操縱調度的功能,但與我遇到的問題無關)。
如果我不傳遞任何參數,我能得到這個工作 - 創建沒有登記表,以及我在創建後修改狀態。一旦我嘗試添加參數,系統出錯 - 我知道這只是我的一個語法誤解,但我不能爲我的生活弄清楚我做錯了什麼。我還沒有在這裏找到這些文檔非常有用,我試着從GH,GH Gists和在線文章中複製和修改示例,但是我無法使其工作。
當前設置 - 理想我想要通過id
,period
和targets
作爲參數傳遞給start_child
,但可以甚至可以將其與一個參數不工作,所以只用一個堅持,直到我能得到它正在運行:
的應用:
defmodule Assay.Application do
use Application
def start(_type, _args) do
children = [
{Assay.SchedulerSupervisor, []},
{Registry, keys: :unique, name: Assay.Scheduler.Registry}
]
opts = [strategy: :one_for_all, name: Assay.Supervisor]
Supervisor.start_link(children, opts)
end
end
主管:
defmodule Assay.SchedulerSupervisor do
use Supervisor
@name Assay.SchedulerSupervisor
def start_link(_args) do
Supervisor.start_link(__MODULE__, :ok, name: @name)
end
def start_schedule(id) do
Supervisor.start_child(@name, [id])
end
def init(_) do
Supervisor.init([Assay.Scheduler], [strategy: :simple_one_for_one, name: @name])
end
end
釷ËGenServer(只顯示相關的初始化函數)
defmodule Assay.Scheduler do
use GenServer
alias Assay.Scheduler
require Logger
defstruct targets: [], period: 60_000, id: nil, active: false
def start_link(id) do
GenServer.start_link(__MODULE__, [id], [name: via_tuple(id)])
end
def init([id]) do
Logger.info "starting a new #{__MODULE__} with id #{id}"
{:ok, %Scheduler{id: id}}
end
end
編輯:實際的錯誤可能會幫助 - 我可以看到ARGS是錯誤的,我只是不明白,爲什麼:
{:error,
{:EXIT,
{:undef,
[{Assay.Scheduler, :start_link, [[], 1], []},
{:supervisor, :do_start_child_i, 3, [file: 'supervisor.erl', line: 381]},
{:supervisor, :handle_call, 3, [file: 'supervisor.erl', line: 406]},
{:gen_server, :try_handle_call, 4, [file: 'gen_server.erl', line: 636]},
{:gen_server, :handle_msg, 6, [file: 'gen_server.erl', line: 665]},
{:proc_lib, :init_p_do_apply, 3, [file: 'proc_lib.erl', line: 247]}]}}}
什麼是你得到確切的錯誤? – Dogbert
ah,對不起,添加了日誌錯誤信息@Dogbert – DanCouper
你確定這是問題中代碼的錯誤信息嗎?您沒有將60000傳遞給start_child,但它在錯誤消息中。 – Dogbert