2010-12-08 13 views
13

Ich benutze JRuby 1.5.6 auf Rails, um mir eine Anwendung zu bauen, die regelmäßig entfernt wird und alle RSS-Podcasts abrufen, die ich auch abonniert habe.jruby on rails Planungsoptionen

Ich habe JRuby hauptsächlich gewählt, weil ich mit Java vertraut bin, das Rails-Framework nutzen möchte und vor allem kann ich die "Heavy Lifting" -Tasks in Java ausführen, wenn Ruby meine Anforderungen nicht erfüllt. Bis jetzt (und ich bin noch in den frühen Entwicklungsphasen) hat dieser hybride Ansatz sehr gut funktioniert.

Ich bin jetzt an einem Punkt, wo ich benötigt, um die Planung von periodischen und lang laufenden Aufgaben zu einem Hintergrundprozess zu implementieren. Meine Anforderungen sind ein datenbankgestütztes Planungssystem, das im Idealfall gut dokumentiert, aktuell gepflegt und sauber ist.

Mein Problem ist jetzt, dass nach vielen Tagen der Suche nach geeigneten aus dem eigenen Edelstein verpackt Lösungen, ich habe mit sehr wenigen Optionen wegen meiner Verwendung von JRuby übrig bleiben.

Einige der Edelsteine ​​Ich habe versucht ...

rufus Scheduler

dies Nachdem verwendet, bevor ich mit seiner Schnittstelle und Dokumentation glücklich bin, aber es ist ein Mangel an Datenbankpersistenz, daher ein Deal Breaker für meine Anforderungen.

delayed_job

Mein würde ideale Lösung delayed_job sein. Gute Dokumentation, die immer noch gepflegt wird und Datenbank gesichert wird, bricht jedoch unter JRuby ab, weil ObjectSpace ausgeschaltet ist (wir können das jedoch durch erneute Aktivierung beheben), aber tödlicher ist die Abhängigkeit von dem Daemonen-Juwel, das einen "fork" wirft, unsicher und deaktiviert standardmäßig auf JRuby "Fehler aufgrund von Einschränkungen in der JRuby-Implementierung.

Es gibt eine Verzweigung auf Github, die keine Abhängigkeit von Daemons hat, aber ich bin nicht glücklich, zu einer Verzweigung aus dem Hauptentwicklungszweig zu wechseln, und ich bin immer noch mit dem ObjectSpace-Problem, das ich unsicher bin hinsichtlich seiner Auswirkungen auf die Leistung.

quarz jruby

Während es vor verschiedenen Quarz basiertes gems gewesen ist, ist ein weiterer Versuch, bei this very recent offering einem glatten rubin wie Interface. Es gibt jedoch nur eine minimale Dokumentation und ich bin mir nicht sicher, ob dies datenbankgestützt sein kann, mein Bauchgefühl ist, dass es das nicht ist.

Das Problem

Während ich hier nur drei Optionen hervorgehoben habe, ich bin mir dessen bewusst, dass es anderen zur Verfügung. Ich konnte jedoch keine Lösung finden, um alle drei Anforderungsfelder anzukreuzen (Dokumente, gepflegt, Datenbank gesichert).

So sind die Fragen ...

Hat mit einer Lösung in dieser Situation und kommen sonst jemand gewesen?

Hat es irgendjemanden geschafft, in jeder Form zu arbeiten?

Gibt es bessere Lösungen, die ich übersehen habe und die meine Bedürfnisse erfüllen?

+1

** Update ** Ich dachte, es lohnt sich, die endgültige Lösung zu veröffentlichen, die ich für die Verwendung mit JRuby festgelegt habe, jetzt bei 1.7.2. Mein aktuelles Setup verwendet Sidekiq und Clockwork. Es hat sich als eine zuverlässige langfristige Lösung erwiesen. –

Antwort

4

Seit über einem Jahr verwenden wir in JRuby die Funktion delayed_job (collectividea/v1.8.4) unter der Produktion. Wir haben keinen ObjectSpace aktiviert und verwenden auch keine Daemons.

eine einfache Rake Aufgabe

namespace :product do 
    desc "Start Delayed Job Worker" 
    task :dw => :environment do 
     Delayed::Worker.new.start 
    end 
    end 

und daemonize es in der OS-abhängigen Art und Weise hergestellt. Auf Linux,

nohup jruby -S rake product:dw > $log_dir/delayed_job_console.log 2>&1 & 
+1

Ich denke, das ist ähnlich zu run , wie Sie in [..]/edelsteine ​​/ delayed_job-3.0.3/lib/delayed/tasks sehen können. rb -> Aufgabe: Arbeit =>: Umgebung Delayed :: Worker.new (: min_priority => ENV ['MIN_PRIORITY'],: max_priority => ENV ['MAX_PRIORITY'],: Warteschlangen => (ENV ['QUEUES '] || ENV [' QUEUE '] ||' ') .sp leuchtet (', '),: leise => falsch) .start –

4

Ich würde resque als Warteschlangensystem empfehlen. Resque ist DelayedJob ähnlich, aber meiner Meinung nach viel besser. Es war developed at GitHub and is used as their queueing system. Ich benutze es seit fast einem Jahr auch in der Produktion und war sehr zufrieden damit.

Resque hat definitiv JRuby-Unterstützung, und alles, was Sie tun müssen, um geplante Jobs zu bekommen, ist ein einfacher Scheduler. Einige empfehlen resque-scheduler, aber ich mag es einfach zu halten und clockwork verwenden, die eine schöne DSL für das Schreiben von einfachen Cron-ähnlichen Aufgaben hat, um Scheduler in Warteschlange zu stellen (siehe: clockwork README). Damit können Sie nur Dinge planen, wie so:

every(1.hour, 'tasks.alert') { Resque.push(:cron, :class => 'TaskAlert', :args => []) } 
2

prüfen https://github.com/kares/jruby-rack-worker Diese delayed_job Lösung unter jruby Umgebung ermöglicht. Noch in Arbeit. Zum Zeitpunkt des Schreibens ist meine Erfahrung, dass es mit einem einzelnen Arbeiter gut funktioniert. Obwohl ich Schwierigkeiten habe, zusätzliche Arbeiter zu machen.

+0

War gut, aber dann wird es jedes Mal gesperrt. Hast du irgendeine Idee? –

1

Ich habe diese Frage ursprünglich im Dezember '10 gestellt und habe seither eine Lösung entwickelt, die ich für einen Verweis auf andere empfehlen würde.

Wie andere hingewiesen haben, ist es möglich, Bibliotheken wie delayed_job mit JRuby zu arbeiten und für einige könnte dies eine akzeptable Lösung sein. Ich wollte jedoch keine Lösung, die einen zusätzlichen Prozess benötigt und daher habe ich ein Juwel entwickelt, das das Executor-Framework von Java nutzt und es in ActiveRecord integriert.

Das Ergebnis ist acts_as_executor, das eine Rails 3.x-Anwendung ermöglicht, mit Executoren und Tasks (die in einem richtigen Java-Thread ausgeführt werden) zu interagieren, genau wie jedes andere ActiveRecord-Modell.

Ich habe kürzlich den Edelstein verschoben, um Kandidat 1 zu veröffentlichen. Werfen Sie einen Blick auf GitHub und .

N.B. Die RubyGems Standardseite zeigt aus irgendeinem Grund immer noch beta2. rc1 ist jedoch immer noch die neueste Version.