Rails执行脚本作为后台作业

时间:2012-11-13 10:09:05

标签: ruby-on-rails background delay

我已经实现了一个独立功能的ruby脚本。 现在我想在我的rails环境中执行这个脚本,增加了将它作为后台作业执行的难度,因为它需要大量的时间处理。

添加delayed_job gem之后,我尝试调用以下句子:

delay.system("ruby my_script.rb")

这是我得到的错误:

Completed 500 Internal Server Error in 95ms
TypeError (can't dump anonymous module: #<Module:0x007f8a9ce14dc0>):
   app/controllers/components_controller.rb:49:in `create'

2 个答案:

答案 0 :(得分:4)

从控制器won't work调用self.delay方法,因为DJ会尝试将控制器序列化为作业。您最好创建一个类来处理您的任务,然后将其方法标记为异步:

class AsyncTask
  def run
    system('ruby my_script.rb')
  end
  handle_asynchronously :run
end

在您的控制器中:

def create
    ...
    AsyncTask.new.run
    ...
end

请参阅readme的“排队作业”部分中的第二个示例。

答案 1 :(得分:0)

与Jef一样,最好的解决方案是创建一个自定义工作。 Jef的答案问题是它的语法(据我所知)是不正确的,这是他的工作处理单个系统命令,而以下将允许你更多的自定义:

# lib/system_command_job.rb
class SystemCommandJob < Struct.new(:cmd)
  def perform
    system(cmd)
  end
end

请注意Struct初始值设定项的cmd参数。它允许您将参数传递给您的作业,因此代码如下所示:

Delayed::Job.enqueue(SystemCommandJob.new("ruby my_script.rb"))