我无法获得任何日志输出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)
我只是想看到这个工作,缺乏记录意味着我不能.这里发生了什么?
我正在构建一个依赖于预定作业的Heroku应用程序.我们之前使用的是Heroku Scheduler,但时钟进程似乎更灵活,更强大.所以现在我们正在使用时钟进程在特定时间/间隔排队后台作业.
Heroku的文档提到,与所有dynos一样,时钟dynos每天至少重启一次 - 这会导致时钟进程跳过预定作业的风险:"由于dynos每天至少重启一次逻辑需要在时钟进程启动时存在,以确保在dyno重启期间不会跳过作业间隔." (参见https://devcenter.heroku.com/articles/scheduled-jobs-custom-clock-processes)
有哪些建议的方法可以确保不会跳过预定的作业,并重新排队错过的任何作业?
一种可能的方法是在作业运行/入队时创建数据库记录,并在时钟作业内定期检查预期记录的存在.最大的缺点是如果时钟dyno存在系统性问题导致它在相当长的一段时间内停机,那么我不能每隔X小时进行一次轮询以确保预定的作业成功运行,因为轮询发生在时钟dyno内.
你是如何处理时钟dyno弹性问题的?
谢谢!
我在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) 我看到人们在几个不同的地方说时钟应该在自己的 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)
这种方式似乎工作正常,但我想知道人们说不要这样做的根本原因。任何指导将不胜感激。提前致谢。
运行 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) 我有一个简单的 sidekiq 作业,我已将其设置为使用时钟每 5 分钟运行一次。我担心的是,如果作业花费的时间超过 5 分钟,它会再次运行,如果它与原始作业同时运行,这可能会导致一些问题。
有没有办法锁定发条,使其仅在前一次运行完成后才运行?
我正在使用带有红宝石发条的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) 我试图了解如何使用发条执行自定义代码.这是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) 我想每个月初开始执行任务。例如:
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)
如何使用发条装置做到这一点?