【发布时间】:2019-10-23 06:17:30
【问题描述】:
我正在尝试通过调用 genServer 模块“Cache”来创建“Cache warmer”以在应用程序启动时运行一次
我创建了一些代码: GenServer "Cache Warmer",用于在应用程序启动时处理单个异步调用,配置为 [restart: :temporary]。主要思想是在施法后返回{:stop, :normal, state},关闭进程
defmodule TlgmBot.Application do
...
def start(_type, _args) do
...
children = [
... some stuff ...
%{
id: Services.Cache.CacheWarmer,
start: {Services.Cache.CacheWarmer, :start_link, [restart: :temporary]},
type: :supervisor
}
%{
id: Services.Cache.Cache,
start: {Services.Cache.Cache, :start_link, []},
type: :supervisor
},
end
end
defmodule Services.Cache.CacheWarmer do
use GenServer
def start_link(_state \\ []) do
GenServer.start_link(__MODULE__, [:ok], name: __MODULE__)
end
def handle_cast({:warm_up_cache}, state) do
debug "loading users..."
load_users()
debug "done."
load_mfc()
{:stop, :normal, state}
end
defp load_users() do
result = RedmineApi.request_rm_users()
case result do
{:ok, users} -> Cache.save_users(users)
{:ok}
_ -> {:error}
end
end
end
并且进程“缓存预热器”仍在一次又一次地运行
请指出我完成此任务的正确方法或帮助我找出我在这里做错了什么。
也许我应该在 application.start() 中添加几行来在这里调用缓存模块而忘记它?
【问题讨论】:
-
GenServer.handle_continue/2肯定是要走的路,但总的来说问题是;你为什么要监督根本不打算监督的事情?生成一个未链接的进程。它会按照你的意愿默默地死去。
标签: elixir gen-server