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