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
является синхронным, и запрос ожидает.
Я хотел сделать его асинхронным, поэтому вместо этого был создан такой процесс
spawn_link(fn ->
UserMailer.send_welcome_email(user)
end)
Запрос не дожидается, пока почта не будет отправлена.
- Хотя это работает, это правильный способ сделать?
- Есть ли какие-либо шансы, что этот процесс станет сиротой или они просто умрут после немедленного выполнения?
- Следует ли вместо этого создать
Supervisor
? - Следует ли вместо этого использовать библиотеку, например https://github.com/akira/exq? (Я чувствую, что даже если
spawn_link
терпит неудачу и регистрирует его в наших журналах phoenix, это будет делать)