【问题标题】:ActiveJob::SerializationErrorActiveJob::SerializationError
【发布时间】:2017-01-11 16:36:54
【问题描述】:

我想将繁重的方法放到后台作业中。 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 吗?

【问题讨论】:

  • 你能发布你的实际代码吗?
  • @MichałMłoźniak 嗨,谢谢。使用 shopify api 更新的代码。仅此一项,您应该会看到相同的错误。

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


【解决方案1】:

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

【讨论】:

  • 啊啊啊我明白了。凉爽的。谢谢你。
猜你喜欢
  • 2015-06-23
  • 1970-01-01
  • 2017-04-15
  • 2018-10-04
  • 2015-03-29
  • 2016-05-20
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多