如何让我的整个应用程序都可以使用 GenServer 进程?
How do I have a GenServer process available to my entire app?
我正在使用 GenServer 作为排队系统。如何让整个应用程序访问相同的进程?
我认为把它放在 application.ex
中就可以了,就像这样:
children = [
supervisor(Prefect, [], name: PrefectQueue)
]
我的 Prefect
模块是 GenServer:
defmodule Prefect do
use GenServer
alias Prefect.Document
# client
def start_link() do
GenServer.start_link(__MODULE__, [])
end
def add(pid, item) do
GenServer.cast(pid, item)
end
# server
def handle_cast(item, list) do
updated_list = [item | list]
{:noreply, updated_list}
end
end
不过我似乎无法在我的控制器中访问它:
defmodule PrefectWeb.DocumentController do
use PrefectWeb, :controller
def create(conn, params) do
Prefect.add(PrefectQueue, params["id"])
conn
|> send_resp(200, "Queued #{Prefect.view(PrefectQueue)}")
end
end
发布到该创建函数会出现此错误:
[info] POST /api/documents
[debug] Processing with PrefectWeb.DocumentController.create/2
Parameters: %{"id" => "1"}
Pipelines: [:api]
[error] #PID<0.349.0> running PrefectWeb.Endpoint terminated
Server: 0.0.0.0:4000 (http)
Request: POST /api/documents
** (exit) exited in: GenServer.call(Prefect.Queue, :view, 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 本身中命名进程,而不是通过主管子列表。尝试:
defmodule Prefect do
use GenServer
alias Prefect.Document
# client
def start_link() do
GenServer.start_link(__MODULE__, [], name: __MODULE__)
end
def add(pid, item) do
GenServer.cast(pid, item)
end
# server
def handle_cast(item, list) do
updated_list = [item | list]
{:noreply, updated_list}
end
end
您的进程现在应该这样调用 Prefect.view(Prefect)
。
我正在使用 GenServer 作为排队系统。如何让整个应用程序访问相同的进程?
我认为把它放在 application.ex
中就可以了,就像这样:
children = [
supervisor(Prefect, [], name: PrefectQueue)
]
我的 Prefect
模块是 GenServer:
defmodule Prefect do
use GenServer
alias Prefect.Document
# client
def start_link() do
GenServer.start_link(__MODULE__, [])
end
def add(pid, item) do
GenServer.cast(pid, item)
end
# server
def handle_cast(item, list) do
updated_list = [item | list]
{:noreply, updated_list}
end
end
不过我似乎无法在我的控制器中访问它:
defmodule PrefectWeb.DocumentController do
use PrefectWeb, :controller
def create(conn, params) do
Prefect.add(PrefectQueue, params["id"])
conn
|> send_resp(200, "Queued #{Prefect.view(PrefectQueue)}")
end
end
发布到该创建函数会出现此错误:
[info] POST /api/documents
[debug] Processing with PrefectWeb.DocumentController.create/2
Parameters: %{"id" => "1"}
Pipelines: [:api]
[error] #PID<0.349.0> running PrefectWeb.Endpoint terminated
Server: 0.0.0.0:4000 (http)
Request: POST /api/documents
** (exit) exited in: GenServer.call(Prefect.Queue, :view, 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 本身中命名进程,而不是通过主管子列表。尝试:
defmodule Prefect do
use GenServer
alias Prefect.Document
# client
def start_link() do
GenServer.start_link(__MODULE__, [], name: __MODULE__)
end
def add(pid, item) do
GenServer.cast(pid, item)
end
# server
def handle_cast(item, list) do
updated_list = [item | list]
{:noreply, updated_list}
end
end
您的进程现在应该这样调用 Prefect.view(Prefect)
。