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"))