Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 如何使GenServer进程可用于我的整个应用程序?_Elixir_Phoenix Framework_Gen Server - Fatal编程技术网

Elixir 如何使GenServer进程可用于我的整个应用程序?

Elixir 如何使GenServer进程可用于我的整个应用程序?,elixir,phoenix-framework,gen-server,Elixir,Phoenix Framework,Gen Server,我正在使用GenServer作为排队系统。如何使整个应用程序都可以访问相同的过程 我想把它放在application.ex中就可以了,就像这样: children = [ supervisor(Prefect, [], name: PrefectQueue) ] MyPerfect模块是GenServer: defmodule Prefect do use GenServer alias Prefect.Document # client def start_link()

我正在使用GenServer作为排队系统。如何使整个应用程序都可以访问相同的过程

我想把它放在
application.ex中就可以了,就像这样:

children = [
  supervisor(Prefect, [], name: PrefectQueue)
]
My
Perfect
模块是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
[info]POST/api/documents
[debug]使用web.DocumentController.create/2进行处理
参数:%{“id”=>“1”}
管道:[:api]
[错误]#PID正在运行。终结点已终止
服务器:0.0.0.0:4000(http)
请求:POST/api/documents
**(退出)退出:GenServer.call(fifter.Queue,:view,5000)
**(退出)无进程:进程不活动或当前没有与给定名称关联的进程,可能是因为其应用程序未启动

您必须在GenServer本身中命名进程,而不是通过supervisor Child列表。尝试:

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

您的进程现在应该这样调用
perfict.view(perfict)

您必须在GenServer本身中命名该进程,而不是通过supervisor Child列表。尝试:

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

您的进程现在应该这样调用
perfict.view(perfict)

您正在使用
perfict.view(perfictqueue)
,但我在
perfict
模块中找不到它。您确定您提供的代码与给定的错误相对应吗?它是应用程序中进程的名称。例如:
supervisor(perfict,[],name:perfictqueue)
。这不管用吗?您正在使用
perfict.view(perfictqueue)
,但我在
perfict
模块中找不到它。您确定您提供的代码与给定的错误相对应吗?它是应用程序中进程的名称。例如:
supervisor(perfict,[],name:perfictqueue)
。那不管用吗?