Skip to content

Instantly share code, notes, and snippets.

@PragmaticEd
Last active June 10, 2019 04:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save PragmaticEd/d723551e199df57fa2d35fa8498190d7 to your computer and use it in GitHub Desktop.
Save PragmaticEd/d723551e199df57fa2d35fa8498190d7 to your computer and use it in GitHub Desktop.
resque & scheduler in rails 5 #rails #resque #scheduler #jobs

resque jobs & scheduler for rails 5

call jobs
TestJob.perform(argument) # perform sync
Resque.enqueue(TestJob, argument)
Resque.enqueue_in(5.days,          TestJob, argument)
Resque.enqueue_at(5.days.from_now, TestJob, argument)
Check failed jobs
Resque::Failure.all
# config/application.rb
module AppName
class Application < Rails::Application
config.active_job.queue_adapter = :resque
end
end
require 'capistrano-resque'
# config/deploy.rb
set :resque_log_file, 'log/resque.log'
set :workers, {main: 2}
namespace :deploy do
after :finishing, 'resque:restart'
after :finishing, 'resque:scheduler:restart'
end
gem 'foreman' # to use command 'foreman start' and run all servers, using Procfile
gem 'resque'
gem 'resque-scheduler'
group :development do
gem 'capistrano-resque'
end
web: rails s -b 0.0.0.0 -p 3000
worker: COUNT=1 QUEUE=* rake environment resque:work
scheduler: rake environment resque:scheduler
# lib/tasks/resque.rake
require 'resque/tasks'
require 'resque/scheduler/tasks'
task 'resque:setup' => :environment do
ENV['QUEUE'] ||= '*'
# for redistogo on heroku http://stackoverflow.com/questions/2611747/rails-resque-workers-fail-with-pgerror-server-closed-the-connection-unexpectedl
# Resque.before_fork = Proc.new { ActiveRecord::Base.establish_connection }
end
# config/initializers/resque.rb
require 'resque'
require 'resque/server'
require 'resque-scheduler'
Resque.redis = 'localhost:6379' #TODO: move to config
Resque.redis.namespace = "resque:app-name-#{Rails.env.to_s}"
Resque.schedule = YAML.load_file(Rails.root.join('config', 'resque_scheduler.yml'))
# config/resque_scheduler.yml
# Cron explained
#
# ┌────────────────── minute (0-59)
# │ ┌──────────────── hour (0-23)
# │ │ ┌────────────── day (month) (1-31)
# │ │ │ ┌──────────── month (1-12)
# │ │ │ │ ┌────────── day (week) (1-45)
# * * * * *
#
# values:
# "*" - every (minute/hour/day/month)
# "," - seperator for multiple values (1,2 = every time minute/hour/day/month is 1 & 2)
# "-" - range (1-3 = every time minute/hour/day/month is from 1 to 3)
# "/" - step (*/5 - every half minute/hour/day/month)
test_job_every_1min_using_cron:
cron: "* * * * *"
class: TestJob
queue: scraper
args: [1]
description: "It's a simple job."
test_job_every_5sec:
every: "5s"
queue: scraper
class: TestJob
args: [5]
description: "It's a simple job."
test_job_every_30sec_with_named_variables:
every: "30s"
queue: scraper
class: TestJob
args:
- foo: 1
bar: 2
description: It's a simple job.
named_args: true
# config/routes.rb
Rails.application.routes.draw do
mount Resque::Server.new, at: "/jobs"
end
# app/jobs/test_job.rb
class TestJob
@queue = :scraper
def perform(id)
sleep(2)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment