Frage

Ich bin mit dem delayed_job Plugin in Rails Hintergrundverarbeitung zu tun, und ich bin ein Schluckauf in der ‚agilen Entwicklung‘ erlebt hat mich bisher in Rails erlebt ...

In der Regel in Schienen, wenn ich einen Fehler getroffen / wollen einige neue Funktionen hinzufügen -. Ich habe einige Code hinzufügen und aktualisieren Sie die Seite und der neue Code läuft

Mit delayed_job, es scheint, wie die Job-Klasse wird nicht neu geladen wird ... wenn ein Job fehlschlägt, und ich gehe und beheben den Fehler und feuern den Job wieder, der alte Code läuft wieder.

Gibt es eine Möglichkeit delayed_job laden Sie die neueste Version der Jobklasse zu machen, bevor es den Aufruf?

Für den Fall, hat dies nichts zu tun - ich weiß delayed_job ein paar verschiedene Optionen auf dem Weg hat Jobs / Aufträge ausführen zu deklarieren:

ist meine Job-Klasse im Verzeichnis lib von Rails und erklärt wie:

class FooJob < Struct.new(:foo_id)

und ich den Job wie dies von der Steuerung Aufruf:

Delayed::Job.enqueue(FooJob.new(params[:id]))
War es hilfreich?

Lösung

Es gibt nichts gebautet dies zu tun. Im Allgemeinen sind Sie verantwortlich für die Verwaltung und Ihre Mitarbeiter neu zu laden. Dies ist wahrscheinlich genauso gut, da Rails Entwicklung Nachladen ist gut, aber nicht perfekt, und zu versuchen, Auto-Reload ein verzögerte Job laufen würde möglicherweise in alle Art subtile Probleme, die ziemlich undurchsichtig sein würden in einem Arbeitsprozess zu debuggen. Auch, wenn es automatisch an die Umgebung für jeden Job eine Menge Anwendungsfälle neu geladen würde in dev-Modus enorm langsam bekommen.

ist mein Vorschlag nur Gebrauch zu bekommen, um rake jobs:work tun und dann Ctrl-C, wenn Sie Änderungen vornehmen. Alternativ können Sie ein Skript erstellen, die nur manuell ausgeführt wird, die Arbeitsplätze auf einer Ad-hoc-Basis (aus delayed_job docs ):

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

Delayed::Worker.new.start  

Andere Tipps

Ich benutze diesen Hack, der ganz schön arbeiten Nähte, aber darüber im Klaren sein, dass es wahrscheinlich sehr Rails und delayed_job Version spezifisch, so dass Sie wahrscheinlich einige Dinge ändern müssen. Getestet mit Rails 3.2.0 und 2.1.4 delayed_job.

Setzen Sie diese in z.B. script/delayed_job_development und es von der Rails root ausführen.

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

Bitte kommentieren, wenn Sie wissen, dass dies eine sehr schlechte Idee oder Dinge bewusst sein, ich kann es verwenden hauptsächlich bei der Bearbeitung und Prüfung Jobs, die nicht unmittelbar mit Jobs ausführen geplant lange in die Zukunft führen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top