我想把一个沉重的提升方法放到后台工作中。 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吗?
答案 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