2013-12-20 39 views
0

也許這是我的任務,也許是我的調度程序,但由於某種原因,我的計劃任務正在運行兩次或將兩個版本保存到數據庫。這裏是我的代碼:rufus調度程序每次運行兩次

report.rb:

def record_page_stats! 
    oauth = Koala::Facebook::OAuth.new 
    @api = Koala::Facebook::API.new oauth.get_app_access_token 
    @fb_page = @api.get_object(self.fb_page_id) 
    self.page_stats.new(like_count: @fb_page["likes"], talking_about_count: @fb_page["talking_about_count"]) 
    self.save 
    end 

和scheduler.rb:

require 'rufus-scheduler' 

scheduler = Rufus::Scheduler.new 

scheduler.every '10m' do 
    Report.where(tracking_page: true).each do |report| 
    report.record_page_stats! 
    end 
end 

我思念的東西真的很明顯?這裏是從所保存的網頁統計的數據庫輸出:

2013-12-20 18:43:06 UTC = 8304 likes and 229 talking about count 
2013-12-20 18:43:08 UTC = 8304 likes and 229 talking about count 
2013-12-20 18:53:06 UTC = 8304 likes and 229 talking about count 
2013-12-20 18:53:08 UTC = 8304 likes and 229 talking about count 
2013-12-20 19:03:06 UTC = 8304 likes and 229 talking about count 
2013-12-20 19:03:08 UTC = 8304 likes and 229 talking about count 
2013-12-20 19:13:06 UTC = 8304 likes and 229 talking about count 
2013-12-20 19:13:08 UTC = 8304 likes and 229 talking about count 
2013-12-20 19:23:07 UTC = 8304 likes and 229 talking about count 
2013-12-20 19:23:33 UTC = 8304 likes and 229 talking about count 
2013-12-20 19:33:06 UTC = 8304 likes and 229 talking about count 
2013-12-20 19:33:32 UTC = 8304 likes and 229 talking about count 

,你可以通過時間戳看到,它運行兩次,每次10分鐘

編輯:

我只是看着數據再次...和調度改變了定時幾次:

  1. 第一,它連續運行作業兩次,每次10分鐘
  2. 的N,它切換到一次每10分鐘
  3. 然後,它切換到一次每5分鐘
  4. 然後,它切換到兩次每5分鐘

編輯2:鎖定後 新的輸出:

2013-12-20 22:14:22 UTC = 176155 likes and 5757 talking about count 
2013-12-20 22:14:24 UTC = 176155 likes and 6994 talking about count 

我的文件現在看起來是這樣的:

require 'rufus-scheduler' 

scheduler = Rufus::Scheduler.new(:lockfile => ".rufus-scheduler.lock") 

scheduler.every '10m' do 
    Report.where(tracking_page: true).each do |report| 
    report.record_page_stats! 
    end 
    log "started Scheduler #{scheduler.object_id}" 
end 
然而

在他roku日誌有一個錯誤:

2013-12-20T22:44:42.625951+00:00 app[worker.1]: 70149016354440 job: 
2013-12-20T22:44:42.625951+00:00 app[worker.1]: 70149016354440  Rufus::Scheduler::EveryJob "10m" {} 
2013-12-20T22:44:42.625951+00:00 app[worker.1]: { 70149016354440 rufus-scheduler intercepted an error: 
2013-12-20T22:44:42.625951+00:00 app[worker.1]: 70149016354440 error: 
2013-12-20T22:44:42.625951+00:00 app[worker.1]: 70149016354440  70149016354440 
2013-12-20T22:44:42.625951+00:00 app[worker.1]: 70149016354440  ArgumentError 
2013-12-20T22:44:42.625951+00:00 app[worker.1]: 70149016354440  wrong number of arguments (1 for 0) 
2013-12-20T22:44:42.625951+00:00 app[worker.1]: 70149016354440  /app/vendor/bundle/ruby/2.0.0/gems/yard-0.8.7.3/lib/yard/globals.rb:16:in `log' 
2013-12-20T22:44:42.625951+00:00 app[worker.1]: 70149016354440  /app/vendor/bundle/ruby/2.0.0/gems/rufus-scheduler-3.0.3/lib/rufus/scheduler/jobs.rb:224:in `call' 
2013-12-20T22:44:42.626163+00:00 app[worker.1]: 70149016354440  /app/vendor/bundle/ruby/2.0.0/gems/rufus-scheduler-3.0.3/lib/rufus/scheduler/jobs.rb:224:in `do_trigger' 
2013-12-20T22:44:42.626163+00:00 app[worker.1]: 70149016354440  /app/vendor/bundle/ruby/2.0.0/gems/rufus-scheduler-3.0.3/lib/rufus/scheduler/jobs.rb:269:in `block (3 levels) in start_work_thread' 
2013-12-20T22:44:42.626163+00:00 app[worker.1]: 70149016354440  /app/vendor/bundle/ruby/2.0.0/gems/rufus-scheduler-3.0.3/lib/rufus/scheduler/jobs.rb:272:in `call' 
2013-12-20T22:44:42.626163+00:00 app[worker.1]: 70149016354440  /app/vendor/bundle/ruby/2.0.0/gems/rufus-scheduler-3.0.3/lib/rufus/scheduler/jobs.rb:272:in `block (2 levels) in start_work_thread' 
2013-12-20T22:44:42.626163+00:00 app[worker.1]: 70149016354440  /app/vendor/bundle/ruby/2.0.0/gems/rufus-scheduler-3.0.3/lib/rufus/scheduler/jobs.rb:258:in `loop' 
2013-12-20T22:44:42.626163+00:00 app[worker.1]: 70149016354440  /app/vendor/bundle/ruby/2.0.0/gems/rufus-scheduler-3.0.3/lib/rufus/scheduler/jobs.rb:258:in `block in start_work_thread' 
2013-12-20T22:44:42.626163+00:00 app[worker.1]: } 70149016354440 . 
2013-12-20T22:44:42.625951+00:00 app[worker.1]: 70149016354440  /app/config/initializers/scheduler.rb:9:in `block in <top (required)>' 
2013-12-20T22:44:44.472460+00:00 app[web.1]: { 69970029016200 rufus-scheduler intercepted an error: 
2013-12-20T22:44:44.472460+00:00 app[web.1]: 69970029016200 job: 
2013-12-20T22:44:44.472460+00:00 app[web.1]: 69970029016200  Rufus::Scheduler::EveryJob "10m" {} 
2013-12-20T22:44:44.472615+00:00 app[web.1]: 69970029016200  ArgumentError 
2013-12-20T22:44:44.472615+00:00 app[web.1]: 69970029016200  wrong number of arguments (1 for 0) 
2013-12-20T22:44:44.472615+00:00 app[web.1]: 69970029016200  /app/vendor/bundle/ruby/2.0.0/gems/yard-0.8.7.3/lib/yard/globals.rb:16:in `log' 
2013-12-20T22:44:44.472615+00:00 app[web.1]: 69970029016200  /app/vendor/bundle/ruby/2.0.0/gems/rufus-scheduler-3.0.3/lib/rufus/scheduler/jobs.rb:224:in `call' 
2013-12-20T22:44:44.472615+00:00 app[web.1]: 69970029016200  /app/vendor/bundle/ruby/2.0.0/gems/rufus-scheduler-3.0.3/lib/rufus/scheduler/jobs.rb:224:in `do_trigger' 
2013-12-20T22:44:44.472615+00:00 app[web.1]: 69970029016200  /app/vendor/bundle/ruby/2.0.0/gems/rufus-scheduler-3.0.3/lib/rufus/scheduler/jobs.rb:269:in `block (3 levels) in start_work_thread' 
2013-12-20T22:44:44.472615+00:00 app[web.1]: 69970029016200  /app/vendor/bundle/ruby/2.0.0/gems/rufus-scheduler-3.0.3/lib/rufus/scheduler/jobs.rb:272:in `call' 
2013-12-20T22:44:44.472615+00:00 app[web.1]: 69970029016200  /app/vendor/bundle/ruby/2.0.0/gems/rufus-scheduler-3.0.3/lib/rufus/scheduler/jobs.rb:272:in `block (2 levels) in start_work_thread' 
2013-12-20T22:44:44.472615+00:00 app[web.1]: 69970029016200  /app/vendor/bundle/ruby/2.0.0/gems/rufus-scheduler-3.0.3/lib/rufus/scheduler/jobs.rb:258:in `loop' 
2013-12-20T22:44:44.473000+00:00 app[web.1]: 69970029016200  /app/vendor/bundle/ruby/2.0.0/gems/rufus-scheduler-3.0.3/lib/rufus/scheduler/jobs.rb:258:in `block in start_work_thread' 
2013-12-20T22:44:44.472460+00:00 app[web.1]: 69970029016200 error: 
2013-12-20T22:44:44.472460+00:00 app[web.1]: 69970029016200  69970029016200 
2013-12-20T22:44:44.472615+00:00 app[web.1]: 69970029016200  /app/config/initializers/scheduler.rb:9:in `block in <top (required)>' 
2013-12-20T22:44:44.473000+00:00 app[web.1]: } 69970029016200 . 
+0

如果你看過我的回答,我說:「像‘登錄‘XYZ’’」。我不會說「輸入這個」。如果你花時間閱讀錯誤而不是直接在這裏粘貼它(就像你直接將我的建議直接粘貼到代碼中一樣),那麼你可能已經學到了一些東西。你想讓我的谷歌正確的方式從Heroku上運行的Rails應用程序登錄,然後解釋給你?我假設你知道如何記錄,因爲你的初始問題報告包含了一些日誌輸出...... -1 – jmettraux

+0

而且你在調度程序初始化之後將「開始調度程序」消息放入預定作業中,而不是在調度程序初始化之後,你是否意識到了你將不得不等待10分鐘以確定有多少個調度程序正在運行?你等了10分鐘看到這些錯誤,甚至沒有意識到複製粘貼並不總是一個好主意? grrrr .... – jmettraux

+0

其中一件好事:您粘貼的日誌顯示兩個進程正在運行「worker.1」和「web.1」。你的兩個調度程序。 rufus調度程序沒有錯。 – jmettraux

回答

0

因此,根據您在問題中放置的標籤,您正在使用Ruby on Rails。

我的印象是你有兩個調度器正在運行(一個是在第一個調用後2秒鐘初始化的,正如日誌輸出所暗示的那樣)。

您可以輕鬆地將類似

log "started Scheduler #{scheduler.object_id}" 

調度初始化後,看看發生了什麼事情。

你沒有提到你在(Webrick,Passenger,Thin,Unicorn,??)之上運行Rails。其中一些運行Rails進程的多個副本。

您可以使用rufus-scheduler中的鎖定系統來防止第二個(或第三個)調度程序啓動。

對於一個簡單的鎖定機甲:https://github.com/jmettraux/rufus-scheduler/#advanced-lock-schemes

在你的編輯您所看到的變化很可能依賴於服務器分叉新的Rails:https://github.com/jmettraux/rufus-scheduler/#lockfile--mylockfiletxt

如果您需要更多(上也許不同的主機上運行多個Rails)複製以應付需求。

+0

我嘗試了鎖定,它似乎沒有工作。它仍然記錄兩條記錄,現在記錄有不同的值!查看新的編輯。第二個值應該是相同的,因爲它們相距秒記錄。 –

+0

有多少個調度程序正在運行? – jmettraux

+0

而且我們仍然不知道您正在運行的是什麼。 – jmettraux