def create(conn, %{"data" => %{"attributes" => user_params}}) do
changeset = User.changeset(%User{}, user_params)
case Repo.insert(changeset) do
{:ok, user} ->
UserMailer.send_welcome_email(user)
conn
|> put_status(:created)
|> render("show.json", model: user)
{:error, changeset} ->
conn
|> put_status(:unprocessable_entity)
|> render(MyApp.ChangesetView, "error.json", changeset: changeset)
end
end
在此控制器操作中,UserMailer.send_welcome_email
是同步的,並且請求等待。在elixir鳳凰應用程序中創建後臺作業的正確方法
我想讓它異步的,因此催生了一個過程像這樣反而
spawn_link(fn ->
UserMailer.send_welcome_email(user)
end)
請求不能等到郵件已發送。
- 雖然它有效,但它是正確的做法嗎?
- 這些過程成爲孤兒還是有機會立即執行後死亡?
- 我們應該創建一個
Supervisor
嗎? - 我們應該使用像https://github.com/akira/exq這樣的庫嗎? (我覺得即使
spawn_link
失敗,並記錄在我們鳳凰的日誌,它會做)
這是不是被接受的答案? – MartinElvar
順便說一句,對於具有後臺隊列選項的列表,您還可以檢查https://elixir.libhunt.com/categories/862-queue。我希望這是有幫助的。 –