简单的 Elixir / Plug 进程问题 - PID 不存在

Simple Elixir / Plug Processes Issue - PID not sticking around

我刚开始使用 Elixir,想用 Plug 构建一个非常简单的 API。我用 this guide 得到一个非常简单的 API 和 运行ning.


基本上,我面临的问题是我注册为 :qs 的进程似乎找不到(并且出错),每当我在queue_service.ex。我想要实现的是一个坚持的过程,这样我就可以跨请求维护状态。


在我的 router.ex 文件中,我有:

defmodule SecondQueue.Router do
  use Plug.Router

  alias SecondQueue.Plug.VerifyParams
  alias SecondQueue.QueueService

  plug Plug.Parsers, parsers: [:urlencoded, :multipart]
  plug :match
  plug :dispatch


  get "/receive-message" do
    # gather query parameters from connection
    queue = Map.get(conn.params, "queue")
    message = Map.get(conn.params, "message")

    # handle the params
    QueueService.handle_incoming(queue, message)

    send_resp(conn, 201, "Created")
  end
end


然后在 queue_service.ex 中,我启动队列进程,将其注册到 :qs 的原子,然后希望稍后能够通过请求调用的函数访问该进程.我有:

defmodule SecondQueue.QueueService do
  alias SecondQueue.QueueStore
  use Agent

  {:ok, agent_pid} = QueueStore.start_queues_link()
  Process.register(agent_pid, :qs)

  def handle_incoming(queue, message) do
    queue_atom = String.to_atom(queue)
    send(:qs, {:put, queue_atom, "success"})
  end
end

最后,在 queue_store.ex 中,我实际上定义了我想要存储状态的进程,以及 运行 一个循环,以便它保持活动状态,并准备好接收消息。我有:

defmodule SecondQueue.QueueStore do
  def start_queues_link() do
    Task.start_link(fn -> queues_loop(%{}) end)
  end

  defp queues_loop(map) do
    receive do
      {:get, key, caller} ->
        send caller, Map.get(map, key)
        queues_loop(map)
      {:put, key, value} ->
        IO.puts("i am here")
        queues_loop(Map.put(map, key, value))
    end
  end
end

更新:
Github 回购:https://github.com/qarthandgi/test-second-queue

Elixir 是一种编译语言。下面的代码在编译阶段执行;运行时没有进程正在启动。

defmodule SecondQueue.QueueService do
  ...
  {:ok, agent_pid} = QueueStore.start_queues_link()
  Process.register(agent_pid, :qs)
  ...
end

相反,您需要将此代码放入一个函数中并显式调用此函数以启动 QueueStore(直接或通过将其插入应用程序的监督树。)