ActiveJob::SerializationError

ActiveJob::SerializationError

我想把繁重的方法放到后台作业中。 Rails 5 ActiveJob或者Redis的使用。不确定我应该使用哪一个。

基本上会有一个 API 使用 gem 并从 API 调用我的本地数据库中填充内容。

控制器:

...

before_action :get_api

def do_later
  GetApiJob.perform_later(foo)
  # Call foo later
end

def foo
  @apis.map do |api|
   puts api.title
  end
end

private
  def get_api
    @apis = ShopifyAPI::Product.find(:all)
  end

...

GetApiJob:

...

queue_as :default

def perform(a)
  a
  # Expect to see a list, if any, of api's name
end

...

当我调用 do_later 时,它会将 foo 放入后台作业。执行该示例代码,我得到:

ActiveJob::SerializationError

我应该为此使用 Sidekiq 吗?

ActiveJob 只是 Rails 应用程序和不同后台作业运行程序之间的通用接口。你不能单独使用 ActiveJob,你仍然需要添加 sidekiq(和 Redis)或 delayed_job 或其他东西。

ActiveJob 在您的 Rails 应用程序中对传递的参数进行序列化,然后在后台作业端对其进行反序列化。但是你不能序列化任何东西,你只能序列化基本类型,如 Fixnum、String、Float、这些基本值的数组、散列或 ActiveRecord 对象。 ActiveRecord 对象使用 GlobalId 进行序列化。

在您的情况下,您传递的是从 shopify api 客户端返回的集合,它不是 ActiveRecord 集合,ActiveJob 不知道如何序列化它。

最好将 api 调用移至后台作业本身。

控制器

# No before_action

def do_later
  # No arguments, because we are fetching all products
  GetApiJob.perform_later
end

GetApiJob

queue_as :default

def perform
  # Fetch list of products
  products = ShopifyAPI::Product.find(:all)
  # Process list of products
end