Rails 6 活动作业为什么我不能发送异步任务?

问题描述

我正在关注 https://guides.rubyonrails.org/action_mailer_basics.html#calling-the-mailer

上的 Action Mailer 指南

我做了几乎相同的教程展示。控制器:

def create
  @user = User.create(user_params)

  if @user && UserMailer.with(user: @user).welcome_email.deliver_later
     token = encode_token({ user_id: @user.id })
     render json: { token: token },status: :created
  else
     render json: @user.errors.messages,status: :bad_request
  end
end

邮递员:

class UserMailer < ApplicationMailer
  default from: 'notifications@example.com'

  def welcome_email
    @user = params[:user]
    @url  = 'http://example.com/login'
    mail(to: @user.email,subject: 'Welcome to My Awesome Site')
  end
end

但是当我提出请求时,Active Job 大喊:

ActiveJob::SerializationError => "Unsupported argument type: User"

使用 deliver_Now

可以正常工作

这表明我们的 :async 适配器有问题。但正如指南所说:

Active Job 的认行为是通过 :async 适配器执行作业。因此,您可以使用 delivery_later 异步发送电子邮件。 Active Job 的认适配器使用进程内线程池运行作业。它非常适合开发/测试环境,因为它不需要任何外部基础设施,但它不适合生产,因为它会在重启时丢弃待处理的作业。如果您需要持久后端,则需要使用具有持久后端(Sidekiq、Resque 等)的 Active Job 适配器。

那么我在这里缺少什么?

解决方法

它不起作用,因为 ActiveJob 不支持这些对象。要使其可访问,您必须将其转换为 json 字符串,然后在邮件程序方法中反序列化。

尝试将对象作为 json 字符串发送并检索 id 值,然后使用:

@user = User.find(params[:user_id])

另一种方法是使用 Resque 或 Sidekiq 来处理这些作业。它们真的很方便。

帮助人们解决问题的其他来源:

https://stackoverflow.com/a/40896988/5832250

如果您想使用 Rails 指南并了解更多信息:

https://guides.rubyonrails.org/active_job_basics.html#globalid

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...