标签: clockwork

登录delayed_job?

我无法获得任何日志输出delayed_job,我不确定我的工作是否正在开始.

这是我的Procfile:

web:     bundle exec rails server
worker:  bundle exec rake jobs:work
worker:  bundle exec clockwork app/clock.rb
Run Code Online (Sandbox Code Playgroud)

这是工作:

class ScanningJob
  def perform
    logger.info "logging from delayed_job"
  end

  def after(job)
    Rails.logger.info "logging from after delayed_job"
  end
end
Run Code Online (Sandbox Code Playgroud)

我看到发条输出到系统输出,我可以看到工作程序执行器启动,但我从未看到我的日志语句命中.我也试过puts无济于事.

我的时钟文件非常简单:

every(3.seconds, 'refreshlistings') { Delayed::Job.enqueue ScanningJob.new }
Run Code Online (Sandbox Code Playgroud)

我只是想看到这个工作,缺乏记录意味着我不能.这里发生了什么?

ruby logging ruby-on-rails delayed-job clockwork

40
推荐指数
1
解决办法
3万
查看次数

Heroku时钟进程:如何确保不跳过作业?

我正在构建一个依赖于预定作业的Heroku应用程序.我们之前使用的是Heroku Scheduler,但时钟进程似乎更灵活,更强大.所以现在我们正在使用时钟进程在特定时间/间隔排队后台作业.

Heroku的文档提到,与所有dynos一样,时钟dynos每天至少重启一次 - 这会导致时钟进程跳过预定作业的风险:"由于dynos每天至少重启一次逻辑需要在时钟进程启动时存在,以确保在dyno重启期间不会跳过作业间隔." (参见https://devcenter.heroku.com/articles/scheduled-jobs-custom-clock-processes)

有哪些建议的方法可以确保不会跳过预定的作业,并重新排队错过的任何作业?

一种可能的方法是在作业运行/入队时创建数据库记录,并在时钟作业内定期检查预期记录的存在.最大的缺点是如果时钟dyno存在系统性问题导致它在相当长的一段时间内停机,那么我不能每隔X小时进行一次轮询以确保预定的作业成功运行,因为轮询发生在时钟dyno内.

你是如何处理时钟dyno弹性问题的?

谢谢!

cron clock scheduler heroku clockwork

12
推荐指数
1
解决办法
1014
查看次数

Rails发条没有运行代码

我在Rails 3.2应用程序中使用gem'clockwork'.该应用程序在Heroku上运行.时钟作业在凌晨1点运行 - 但它没有执行代码.

这是clock.rb代码:

  Clockwork.every(1.day, 'DailyJob', :at => '01:00'){
    StatsMailer.stats_email.deliver
    Forecast.where(:run_date => Date.today).each  do |forecast|
      woschedules_run_jobplans_path(:id => forecast.woschedule_id)
    end
  }
Run Code Online (Sandbox Code Playgroud)

日志显示:

9月04日00:00:05 ndeavor-staging app/clock.1:#<NoMethodError:未定义方法`woschedules_run_jobplans_path'用于发条:模块>

如果我耙路线,我得到:

woschedules_run_jobplans GET   /woschedules/run_jobplans(.:format) woschedules#run_jobplans
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails heroku ruby-on-rails-3.2 clockwork

7
推荐指数
1
解决办法
739
查看次数

发条需要自己的过程吗?

我看到人们在几个不同的地方说时钟应该在自己的 dyno 上运行,并且 procfile 可能看起来像这样(来自 heroku 的示例):

clock: bundle exec clockwork lib/clock.rb
Run Code Online (Sandbox Code Playgroud)

是否有任何理由不在与工人相同的 dyno 上运行它?有一个看起来像这样的过程:

worker: bundle exec clockwork clock.rb & bundle exec sidekiq -C config/sidekiq.yml -L log/sidekiq.log
Run Code Online (Sandbox Code Playgroud)

这种方式似乎工作正常,但我想知道人们说不要这样做的根本原因。任何指导将不胜感激。提前致谢。

ruby heroku sidekiq clockwork

6
推荐指数
1
解决办法
173
查看次数

Clockwork 对 ActiveJob 后台作业进行排队

运行 Rails 4.2.0,因此我使用 ActiveJob w/ Sidekiq 后端。我需要调用定期安排的后台作业,因此我希望使用 Clockwork,但我还没有看到任何有关如何将其与 ActiveJob 一起使用的示例。

这是我的 lib/clock.rb,基于 Clockwork Github 示例:

require 'activejob'
module Clockwork
  handler do |job, time|
    puts "Running #{job}, at #{time}"
    ProductUpdateJob.perform_later
  end

  every(30.seconds, 'ProductUpdateJob.perform_later')

end
Run Code Online (Sandbox Code Playgroud)

更新:

我能够让它适合我的情况,但我对这个解决方案并不完全满意,因为我必须加载整个环境。我只想运行 ActiveJobs 所需的最低限度。

require 'activejob'
module Clockwork
  handler do |job, time|
    puts "Running #{job}, at #{time}"
    ProductUpdateJob.perform_later
  end

  every(30.seconds, 'ProductUpdateJob.perform_later')

end
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails clockwork rails-activejob

5
推荐指数
1
解决办法
1417
查看次数

如何确保同一作业不会同时运行两次?

我有一个简单的 sidekiq 作业,我已将其设置为使用时钟每 5 分钟运行一次。我担心的是,如果作业花费的时间超过 5 分钟,它会再次运行,如果它与原始作业同时运行,这可能会导致一些问题。

有没有办法锁定发条,使其仅在前一次运行完成后才运行?

ruby ruby-on-rails sidekiq clockwork

5
推荐指数
1
解决办法
3375
查看次数

日志轮换进程间锁定失败的opswork发条

我正在使用带有红宝石发条的t2.medium机器的opswork.

每30秒我们就会触发一份工作.

SPAWNED BG JOB FOR TASK: 20 for SC: 20 with Sidekiq id: 3afda705eaf597edb4bcc257
log rotation inter-process lock failed. No such file or directory @ rb_sysopen - log/sql.log
log rotation inter-process lock failed. No such file or directory @ rb_sysopen - log/sql.log
log rotation inter-process lock failed. No such file or directory @ rb_sysopen - log/sql.log
log rotation inter-process lock failed. No such file or directory @ rb_sysopen - log/sql.log
log rotation inter-process lock failed. No such file or …
Run Code Online (Sandbox Code Playgroud)

ruby logging ruby-on-rails logrotate clockwork

5
推荐指数
0
解决办法
266
查看次数

使用发条的预定作业和自定义时钟进程

我试图了解如何使用发条执行自定义代码.这是lib/clock.rbHeroku在其devcenter文档中使用的示例文件.

require File.expand_path('../../config/boot',        __FILE__)
require File.expand_path('../../config/environment', __FILE__)
require 'clockwork'

include Clockwork

every(4.minutes, 'Queueing interval job') { Delayed::Job.enqueue IntervalJob.new }
every(1.day, 'Queueing scheduled job', :at => '14:17') { Delayed::Job.enqueue ScheduledJob.new }
Run Code Online (Sandbox Code Playgroud)

什么是IntervalJob和ScheduledJob?这些文件应该放在哪里?我想运行自己的自定义作业,可以访问我的数据库记录.

编辑

这是我的 /lib/clock.rb

require 'clockwork'
require './config/boot'
require './config/environment'

module Clockwork

  handler do |job|
    puts "Running #{job}"
  end

  every(2.minutes, 'Filtering Streams') { Delayed::Job.enqueue FilterJob.new}
end
Run Code Online (Sandbox Code Playgroud)

这是我的 /lib/filter_job.rb

  class FilterJob
    def perform
      @streams = Stream.all

      @streams.each do |stream|
      # manipulating stream properties
      end
    end
   end
Run Code Online (Sandbox Code Playgroud)

我收到错误:

uninitialized constant …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails heroku scheduled-tasks clockwork

2
推荐指数
1
解决办法
2516
查看次数

如何在月初触发Clockwork任务?

我想每个月初开始执行任务。例如:

2017-01-01 00:00:00 // January has just started
2017-02-01 00:00:00 // February has just started ...
...
Run Code Online (Sandbox Code Playgroud)

如何使用发条装置做到这一点?

ruby-on-rails clockwork

2
推荐指数
1
解决办法
487
查看次数