2

我有一个作为独立功能实现的 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'
4

2 回答 2

4

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

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

在您的控制器中:

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

请参阅自述文件的“排队作业”部分中的第二个示例。

于 2012-11-13T11:06:38.957 回答
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"))
于 2012-11-13T11:20:42.087 回答