如何解决由于名称不正确,调用 GenServer 失败
我在图书馆里有这个 GenServer:
defmodule MyLib.Cache do
use GenServer
def start_link([]) do
IO.puts("****cache genserver,name: #{__MODULE__}")
# GenServer.start_link(__MODULE__,%{},name: __MODULE__)
GenServer.start_link(__MODULE__,name: MyLibcache) # no dot
end
# [.........]
还有这个应用程序:
defmodule MyApp.Application do
use Application
def start(_type,_args) do
import Supervisor.Spec
children = [
{Phoenix.PubSub,[name: MyApp.PubSub,adapter: Phoenix.PubSub.PG2]},{MyLib.Repo,[]},{MyAppWeb.Endpoint,{MyLib.Cache,[]} # notice the dot
]
更新:
运行时出错,仅当我尝试访问调用 Cache 的页面时,即不是在启动时:
exited in: GenServer.call(MyLibcache,{:get,"Elixir.MyLib.Dal.User.2"},5000) ** (EXIT) no process: the process is not alive or there's no process currently associated with the given name,possibly because its application isn't started
也就是说,这不会出错:
GenServer.start_link(__MODULE__,name: MyLibcache)
# or
# GenServer.start_link(__MODULE__,name: MyLib.Cache) # with dot
GenServer.start_link(__MODULE__,name: __MODULE__)
解决方法
Supervisor.Spec
自 Elixir 1.5 起已被弃用。您不需要使用它。这是一个工作示例:
defmodule MyLib.Cache do
use GenServer
def init(state),do: {:ok,state}
def start_link(state) do
GenServer.start_link(__MODULE__,state,name: __MODULE__)
end
end
然后在 application.ex
中:
def start(_type,_args) do
children = [
MyLib.Cache
]
opts = [strategy: :one_for_one,name: MyApp.Supervisor]
Supervisor.start_link(children,opts)
end
为什么当我指定名称时它工作正常:MyLibCache(不带点)虽然名称必须是 MyLib.Cache - 带点?
GenServer.start_link/3
的 name
参数是服务器的名称,而不是模块的名称。它们可以相同,但它们不必相同。您在此处提供的名称是稍后需要提供给 Genserver.call/3
的名称。有关详细信息,请参阅 Name registration。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。