Rails执行脚本作为后台作业

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

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

delay.system("ruby my_script.rb") 

这是我得到的错误:

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

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

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

在你的控制器中:

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

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

像杰夫所说,最好的解决方案是创建一个自定义工作。 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"))