简单的 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
(直接或通过将其插入应用程序的监督树。)
我刚开始使用 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
(直接或通过将其插入应用程序的监督树。)