2013-12-20 1 views
0

어쩌면 내 스케줄러 일 수도 있습니다. 그러나 어떤 이유로 스케줄 된 태스크가 두 번 실행되거나 DB에 두 버전을 저장하고 있습니다. 여기 내 코드는 다음과 같습니다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 

내가 정말 뭔가를 분명 실종? 여기에 저장된 페이지 통계 데이터베이스의 출력입니다 : 두 번 10 분마다

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. 먼저
  2. N, 그것은 일단 십분 후
  3. 당 한번 오분 후
  4. 당이 전환하도록 전환하는 전환 두배 5분

EDIT 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-scheduler에는 아무런 문제가 없습니다. – 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

당신의 편집에 표시되는 변화는 아마도 새로운 레일을 분기 서버에 연결되어 있습니다 : 당신이 더 필요한 경우 (아마도 다른 호스트에서 여러 레일을 실행) https://github.com/jmettraux/rufus-scheduler/#lockfile--mylockfiletxt

수요에 대처할 수있는 사본.

+0

나는 잠금을 시도했으나 작동하지 않는 것 같습니다. 그것은 여전히 ​​두 개의 레코드를 기록하며 레코드의 값이 다릅니다! 새 수정보기. 두 번째 값은 초 단위로 기록되기 때문에 동일해야합니다. –

+0

실행중인 스케줄러의 수는 얼마입니까? – jmettraux

+0

그리고 우리는 여전히 당신이 그 위에 무엇을 달리고 있는지 알지 못합니다. – jmettraux

0

그래서 당신은 Heroku에 있습니다. https://devcenter.heroku.com/articles/clock-processes-ruby

당신이 좀 더 구글 경우 또는 스케줄러와 같은 것들에 대한 그들이 떨어져 레일 과정에서 특별한 프로세스를 실행하는 방법을 설명하는 다른 장소를 찾을 수있는 Heroku가 문서를 검색 :

이 도움이 될 수 있습니다 배경 노동자.

이 너무 도움이 될 수 있습니다 : 당신이 내 대답을 읽으면 https://devcenter.heroku.com/articles/procfile