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