RoR:延迟工作不起作用

时间:2013-12-19 07:39:15

标签: ruby-on-rails ruby

我希望控制器中的方法执行在后台运行,这样速度不会受到影响。我发现这可以通过延迟工作来完成。

以下是我想延迟的方法:

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

3 个答案:

答案 0 :(得分:1)

将您要执行的代码放在perform方法中,并将该类列入延迟作业,执行时将调用perform方法

例如:

/lib/product_count.rb
class 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.

唷!!