代码之家  ›  专栏  ›  技术社区  ›  Nate

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

  •  1
  • Nate  · 技术社区  · 15 年前

    我正在使用Rails中的延迟工作插件来进行后台处理,我在“敏捷开发”中遇到了一个小问题,我在Rails中经历了这么多……

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

    对于延迟的作业,似乎没有重新加载作业类…如果一个作业失败了,我去修复错误并再次启动该作业,则旧代码将再次运行。

    在调用作业类之前,是否有任何方法使延迟的作业加载作业类的最新版本?

    以防万一,这和它有任何关系-我知道延迟的作业在声明作业/运行作业的方式上有几个不同的选项:

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

    class FooJob < Struct.new(:foo_id)
    

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

    Delayed::Job.enqueue(FooJob.new(params[:id]))
    
    2 回复  |  直到 13 年前
        1
  •  1
  •   gtd    15 年前

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

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

    #!/usr/bin/env ruby
    require File.dirname(__FILE__) + '/../config/environment'
    
    Delayed::Worker.new.start  
    
        2
  •  0
  •   Mattias Wadman    13 年前

    我使用这个hack,它的接缝可以很好地工作,但是要注意,它可能是非常Rails和延迟的作业版本,所以您可能需要更改一些东西。使用Rails 3.2.0和Delayed_Job 2.1.4进行测试。

    把这个放进例如 script/delayed_job_development 从轨道根部开始运行。

    #!/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
    

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