微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

由于名称不正确,调用 GenServer 失败

如何解决由于名称不正确,调用 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
        ]
  • 为什么当我指定名称时它工作正常:MyLibcache(不带点)虽然名称必须是 MyLib.Cache - 带点?

  • 我希望能够在 GenServer 中使用 name: __MODULE__。但是有了它,它将无法在 application.ex 中启动它,因为它找不到具有这样名称的模块。如何解决

更新

运行时出错,当我尝试访问调用 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/3name 参数是服务器的名称,而不是模块的名称。它们可以相同,但它们不必相同。您在此处提供的名称是稍后需要提供给 Genserver.call/3 的名称。有关详细信息,请参阅 Name registration

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。