Rails / delayed_job – 想要加载最新版本的作业类

我正在使用Rails中的delayed_job插件进行后台处理,而我在Rails中遇到的“敏捷开发”中遇到了一个小问题…

通常在rails中如果我遇到错误/想要添加一些新function – 我只需添加一些代码并刷新页面并运行新代码。

使用delayed_job,似乎没有重新加载作业类…如果作业失败,我去修复错误并再次激活作业,旧代码再次运行。

有没有办法让delayed_job在调用之前加载最新版本的作业类?

万一这与它有什么关系 – 我知道delayed_job在声明作业/运行作业的方式上有几个不同的选项:

我的作业类位于Rails的lib目录中,声明如下:

class FooJob < Struct.new(:foo_id) 

我从控制器调用这样的工作:

 Delayed::Job.enqueue(FooJob.new(params[:id])) 

没有内置的东西可以做到这一点。 通常,您负责管理和重新加载您的员工。 这可能也是如此,因为Rails开发重新加载是好的但不完美,并且尝试自动重新加载延迟的作业可能会遇到所有类型的微妙问题,这些问题对于在工作进程内调试来说是非常不透明的。 此外,如果它为每个作业自动重新加载环境,那么很多用例在开发模式下会变得非常慢。

我的建议只是用于做rake jobs:work ,然后在进行更改时使用Ctrl-C 。 或者,您可以创建一个仅在ad-hoc基础上手动运行作业的脚本(取自delayed_job docs ):

 #!/usr/bin/env ruby require File.dirname(__FILE__) + '/../config/environment' Delayed::Worker.new.start 

我使用这个hack接缝工作相当不错,但请注意它可能非常Rails和delayed_job版本特定所以你可能需要改变一些东西。 使用Rails 3.2.0和delayed_job 2.1.4进行测试。

把它放到例如script/delayed_job_development并从Rails根目录运行它。

 #!/usr/bin/env ruby require File.expand_path('../config/environment', File.dirname(__FILE__)) require 'delayed/worker' require "rails/console/app" class DummyConsoleClass include Rails::ConsoleMethods end dummy_console = DummyConsoleClass.new worker = Delayed::Worker.new({:quiet => false}) puts "Waiting for jobs..." loop do if Delayed::Job.find_available(worker.name).count > 0 puts "Found jobs" dummy_console.reload! loop do break if worker.work_off.sum == 0 end puts "Done, waiting for jobs..." end sleep(2) end 

如果您知道这是一个非常糟糕的想法或需要注意的事项,请发表评论。我主要在编辑和测试立即运行的作业时使用它,而不是计划在未来运行的作业。