2010-12-08 67 views
13

我在Rails上使用JRuby 1.5.6來構建自己的應用程序,它將定期離開並檢索我訂閱的任何RSS Podcast。jruby on rails調度選項

我選擇JRuby的原因主要是因爲我熟悉Java,希望利用Rails框架,最重要的是,當Ruby不符合我的要求時,我能夠在Java中執行「繁重」任務。到目前爲止(我還處於開發的早期階段),這種混合方法一直非常成功。

我現在正處於需要將定期和長時間運行任務安排到後臺進程的時間點。我的要求是擁有一個數據庫支持的調度系統,理想情況下,這些系統是有據可查的,目前維護和清潔。

我現在的問題是,經過多天的研究,找到適合自己封裝的解決方案,我似乎留下了很少的選擇,因爲我使用了JRuby。

一些我試過的寶石......

魯弗斯調度

曾使用此之前,我很高興與它的界面和文檔,但還缺乏數據庫持久性的,因此成爲我的要求的破產者。

delayed_job的

我的理想解決方案將是delayed_job的。但是,由於ObjectSpace被關閉(我們可以通過重新啓用來解決這個問題),但是由於仍然在維護和數據庫支持的良好文檔,在JRuby下會中斷,但更嚴重的是,對守護進程的依賴gem拋出一個「fork是不安全的並且被禁用默認情況下在JRuby上「由於JRuby實現中的限制而出現錯誤。

在github上有一個不依賴於守護進程的fork,但是我不開心切換到主開發分支的一個fork,我仍然留下ObjectSpace問題,我不確定至於它的性能影響。

石英jruby的

雖然已經有各種石英基於寶石之前,this very recent offering是提供一種光滑的紅寶石狀接口的另一嘗試。然而,有很少的文檔,我不確定如果這可以數據庫支持,我的直覺是它不是。

問題

雖然我只強調3個選項在這裏,我知道有其他人可用。然而,我卻找不到解決方案來打勾所有3個需求框(文檔,維護,數據庫支持)。

所以這個問題......

任何人都有過這種情況,並提出了一個解決方案?

有沒有人設法讓delayed_job以任何形式工作?

有沒有更好的解決方案在那裏,我忽略並滿足我的需求?

+1

**更新**我認爲值得發佈我決定使用JRuby的最終解決方案,現在在1.7.2。我目前的設置使用Sidekiq和發條。它已被證明是一個可靠的長期解決方案 – 2013-01-22 01:06:29

回答

4

我們一直在使用JRuby下的delayed_job(collectiveidea/v1.8.4)超過一年的時間。 我們還沒有啓用ObjectSpace,也沒有使用守護進程gem。

創建一個簡單的rake任務

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

,並在操作系統相關的方式守護進程了。在linux上,

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

我認爲這與運行類似,您可以在[..]/gems/delayed_job-3.0.3/lib/delayed/tasks中看到。 rb - > task:work =>:environment do Delayed :: Worker.new(:min_priority => ENV ['MIN_PRIORITY'],::max_priority => ENV ['MAX_PRIORITY'],::queues =>(ENV ['QUEUES '] || ENV ['QUEUE'] ||'').sp lit(','),:quiet => false).start – 2012-10-15 01:29:16

4

我會推薦resque作爲排隊系統。 Resque與DelayedJob類似,但在我看來好多了。這是developed at GitHub and is used as their queueing system。我也在生產中使用它近一年,我一直對它感到非常滿意。

Resque絕對具有JRuby支持,並且您只需要執行一項簡單的調度程序即可完成預定作業。有些人推薦resque-scheduler,儘管我喜歡保持簡單,並且使用clockwork,它具有很好的DSL,用於編寫簡單的類似cron的任務來排隊調度程序(請參閱:clockwork README)。就這樣,你可以安排的東西,像這樣:

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

檢查https://github.com/kares/jruby-rack-worker 這樣的delayed_job的JRuby環境下的解決方案。 仍在工作中。在編寫本文時,我的經驗是,它可以在單個工作人員的情況下正常工作。 雖然我在添加額外的工人時遇到困難。

+0

工作正常,但每次都會被鎖定。你有什麼主意嗎? – 2012-07-12 21:23:16

1

我最初在12年10月問過這個問題,並且自此開發了一個解決方案,我認爲這個解決方案值得回覆供其他人蔘考。

正如其他人指出的,有可能像late_job一樣使用JRuby等庫,對於某些情況這可能是一個可接受的解決方案。然而,我不想要一個需要額外進程運行的解決方案,考慮到這一點,我開發了一個利用Java的Executor框架並將其與ActiveRecord集成的gem。

結果是acts_as_executor,它允許Rails 3.x應用程序與執行程序和任務(將在適當的Java線程中運行)進行交互,就像任何其他ActiveRecord模型一樣。

我最近把寶石移到了候選版本1上。看看GitHubRubygems

N.B.由於某些原因,RubyGems默認頁面仍然顯示beta2。然而rc1仍然是最新版本。