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

时间:2009-10-22 19:56:32

标签: ruby-on-rails classloader delayed-job

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

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

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

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

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

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

class FooJob < Struct.new(:foo_id)

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

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

2 个答案:

答案 0 :(得分:1)

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

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

#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../config/environment'

Delayed::Worker.new.start  

答案 1 :(得分:0)

我使用这个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

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