2015-12-07 126 views
0

我有一些與第三方應用程序的API一起工作的方法。在按鈕上點擊是沒有問題的,但它應該是永久性的過程。如何在Ruby-on-Rails中運行循環後臺進程?

如何運行它們的背景?以及如何暫停循環以使其他作品使用相同的API並在作業完成後恢復循環。

現在我讀到ActiveJob,但其有時間僅依賴關係......

UPDATE

我試着wheneversidekiq使它,任務運行,但它什麼都不做。在哪裏查找日誌我無法理解。

**schedule.rb** 

every 1.minute do 
    runner "UpdateWorker.perform_async" 
end 

**update_worker.rb** 

    class UpdateWorker 
     include Sidekiq::Worker 
     include CommonMods 

     def perform 
     logger.info "Things are happening." 
     logger.debug "Here's some info: #{hash.inspect}" 
     myMethod 
     end 
     def myMethod 
      .... 
      .... 
      .... 
     end 
    end 

這不完全是我所需要的,但更好的是什麼都沒有。有人可以用例子解釋我嗎?

UPDATE 2經過代碼操作後,絕對有必要重新啓動sidekiq。有了這個問題就解決了,但我不確定這是最好的方法。

+1

你需要[每當寶石(HTTPS ://github.com/javan/whenever)來調度你的cron作業(task)和後臺進程[sidekiq gem](https://github.com/mperham/sidekiq)這裏是[rails cast for background process]( http://railscasts.com/episodes/366-sidekiq)。 –

+0

您可以用'set:output','log/cron.log''例如 – theDrifter

回答

0

有幾個庫定期安排工作。例如,您可以使用sidekiq-cron每分鐘運行一次作業。

如果您想暫停一段時間,您可以在某處設置標誌(Redis /數據庫/文件),並在檢測到時跳過執行。

在一個有點相關的說明:不要使用sidetiq。它非常棒,但它不再被維護,並且與當前的Sidekiq版本不兼容。

+0

將輸出直接定義到'config/schedule.rb'中,但我不知道需要多少時間才能完成這項工作。爲此,我不能說我需要的工作必須每1或5分鐘執行一次。完成工作後我可以說執行工作。換句話說,它是循環的。 – nobilik

+2

您可以將一份新工作列入當前工作的最後一步。 – spickermann

0

只需在檢查一下表明它應該的標誌之後,在作業完成後只需在ensure部分中排入下一個執行部分即可。

此外,我建議增加一些延遲出現使你不上的一些錯誤與死循環結束了內部工作

0

您可以定義哪些排入本身就是一項工作:

class MyJob < ActiveJob::Base 
    def perform(*args) 
    # Do something unless some flag is raised 
    ensure 
    self.class.set(wait: 1.hour).perform_later(*args) 
    end 
end 
0

我不知道ActiveJobs,但我可以推薦使用whenever創建cron(週期性背景)作業。基本上你最終會寫一個rake任務。就像這樣:

desc 'send digest email' 
task send_digest_email: :environment do 
    # ... set options if any 
    UserMailer.digest_email_update(options).deliver! 
end 

我從來沒有加入耙子任務本身,而是反覆處理,你可以做在某種程度上是這樣(從回答這個具體問題)

Rake::Task["send_digest_email"].execute