我希望控制器中的方法执行在后台运行,这样速度不会受到影响。我发现这可以通过延迟工作来完成。
以下是我想延迟的方法:
private
def update_product_count(skus, qty)
path = File.expand_path('../../../voylla_scripts/eBay', __FILE__)
system "python2 "+path+"/ReviseOnOrder.py #{skus.to_json} #{qty.to_json} #{path}> output"
end
我尝试使用:
def show
if defined? Delayed::Job
Delayed::Job.enqueue(update_product_count(@skus.to_s, @qty.to_s))
end
end
这会在延迟方法中运行脚本,但会出错:
ArgumentError in OrdersController#show
Cannot enqueue items which do not respond to perform
并且不会呈现与show
对应的视图。
def show
delay.update_product_count(@skus.to_s, @qty.to_s)
end
这不会运行该方法并且还会出现以下错误:
ArgumentError in OrdersController#show
wrong number of arguments (1 for 0)
我也试过handle_asynchronously :update_product_count
。但这也给了wrong number of arguments (1 for 0)
请有人帮我解决这个问题。感谢
编辑:以下更改不会出现任何错误,但脚本似乎确实在运行
/lib/update_count.rb
class UpdateCount < Struct.new(:skus, :qty, :path)
def perform
system "python2 "+path+"/ReviseOnOrder.py #{skus.to_json} #{qty.to_json} #{path}"
end
end
/app/controller/order_controller.rb:
require 'update_count'
def show
Delayed::Job.enqueue(UpdateCount.new(@skus.to_s, @qty.to_s, path))
end
答案 0 :(得分:1)
将您要执行的代码放在perform方法中,并将该类列入延迟作业,执行时将调用perform方法
例如:
/lib/product_count.rbclass ProductCount < Struct.new(:skus, :qty)
def perform
path = File.expand_path('../../../voylla_scripts/eBay', __FILE__)
system "python2 "+path+"/ReviseOnOrder.py #{skus.to_json} #{qty.to_json} #{path}> output"
end
end
拨打延迟的工作
延迟:: Job.enqueue(ProductCount.new(@ skus.to_s,@ qty.to_s),: queue =&gt;“product_count”)
答案 1 :(得分:0)
您需要使用公共方法“perform”创建一个新类,这将填充您想要的所有工作:
class MegaJob
def initialize(options=nil)
@skus = options[:skus]
@qty = options[:qty]
end
def perform
update_product_count
end
private
def update_product_count
path = File.expand_path('../../../voylla_scripts/eBay', __FILE__)
system "python2 "+path+"/ReviseOnOrder.py #{@skus.to_json} #{@qty.to_json} #{path}> output"
end
end
开始这项工作:
Delayed::Job.enqueue MegaJob.new(skus: your_skus, qty: your_qty)
PS不要复制并粘贴示例!
答案 2 :(得分:0)
有点尴尬:
script/delayed_job start.
唷!!