1

我正在使用 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]))
4

2 回答 2

1

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

我的建议只是习惯于做rake jobs:work,然后Ctrl-C当你做出改变。或者,您可以创建一个仅临时手动运行作业的脚本(取自delay_job docs):

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

Delayed::Worker.new.start  
于 2009-10-22T20:34:49.477 回答
0

我使用这个 hack 来很好地工作,但请注意它可能非常特定于 Rails 和 delay_job 版本,因此您可能需要更改一些内容。使用 Rails 3.2.0 和 delay_job 2.1.4 测试。

将它放入 egscript/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

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

于 2011-10-22T17:16:29.613 回答