ActiveJob :: SerializationError

时间:2016-09-03 21:16:36

标签: ruby-on-rails ruby ruby-on-rails-5

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

基本上会有一个使用gem的API,并将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吗?

1 个答案:

答案 0 :(得分:0)

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

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

在您的情况下,您传递的是从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