Skip to content

Instantly share code, notes, and snippets.

@robhurring
Created December 7, 2010 20:09
Show Gist options
  • Save robhurring/732327 to your computer and use it in GitHub Desktop.
Save robhurring/732327 to your computer and use it in GitHub Desktop.
Delayed Job with Sinatra -- without sinatra specific gems, etc.
#!/usr/bin/env ruby
# make this mirror your config/environment files
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'dj-sinatra'))
require 'delayed/command'
Delayed::Command.new(ARGV).daemonize
# Caressing DelayedJob to work with Sinatra.
# I'm not sure if there is a gem for this or not, but i'm not a big fan
# of installing gems if i don't have to -- so heres what i found to be the
# bare foundation necessary to get delayed jobs running with sinatra
#
# 1. ./bin/delayed_job -- taken from the DJ gem's generator template but
# modified to point to this "environment" file rather than lib/environment
# 2. log/delayed_job.log -- DJ needs this
# 3. tmp/pids -- DJ needs this
# 4. Rails.logger -- DJ needs this
# 5. RAILS_ROOT -- DJ needs this constant defined
# 6. Delayed::Worker.backend = :active_record (or Delayed::Worker.guess_backend to guess)
# 7. migration file -- can take this from github or the gem's generator templates
#
# Debugging / Starting:
#
# 1. ./bin/delayed_job run
# 2. irb -r ./dj-sinatra.rb
# 3. tail -f log/delayed_job.log
#
# Console:
#
# Delayed::Job.enqueue SuccessfulJob.new # => should be clean in the logs/db table
# Delayed::Job.enqueue FailureJob.new # => should show failure message, etc.
#
# Author:: Rob Hurring
# Date:: 2012-12-7
#
# I know AR/AS/DJ are out of date, but the project that needed this was running on a
# non-rails-3 server. either way, thats not the point :)
require 'rubygems'
gem 'sinatra'
gem 'activesupport', '~> 2.3.8'
gem 'activerecord', '~> 2.3.8'
gem 'delayed_job', '= 2.0.3'
require 'sinatra'
require 'logger'
require 'active_support'
require 'active_record'
require 'delayed_job'
# Global app logger
Log = Logger.new(File.expand_path('../log/app.log', __FILE__))
# DelayedJob wants us to be on rails, so it looks for stuff
# in the rails namespace -- so we emulate it a bit
module Rails
class << self
attr_accessor :logger
end
end
Rails.logger = Log
ActiveRecord::Base.logger = Log
# this is used by DJ to guess where tmp/pids is located (default)
RAILS_ROOT = File.expand_path('..', __FILE__)
# Configure DelayedJob
Delayed::Worker.backend = :active_record
Delayed::Worker.destroy_failed_jobs = true
Delayed::Worker.sleep_delay = 5
Delayed::Worker.max_attempts = 5
Delayed::Worker.max_run_time = 5.minutes
# for brevity i'm not including the migration here
# you can figure that out from the README on github
# this is an existing project w/ a delayed_jobs file
ActiveRecord::Base.establish_connection({
:adapter => 'mysql2',
:host => 'localhost',
:username => 'root',
:password => '',
:database => 'your_database_with_a_delayed_jobs_table',
})
# Jobs to test
class SuccessfulJob
def perform
true
end
end
class FailureJob
def perform
raise "Failed!"
end
end
########### START OF RAD SINATRA APP ###########
get '/' do
"blah blah blah blah"
end
task :environment do
require './dj-sinatra'
end
namespace :jobs do
desc "Clear the delayed_job queue."
task :clear => :environment do
Delayed::Job.delete_all
end
desc "Start a delayed_job worker."
task :work => :environment do
Delayed::Worker.new(:min_priority => ENV['MIN_PRIORITY'], :max_priority => ENV['MAX_PRIORITY']).start
end
end
#!/bin/sh
# run from djsinatra folder
mkdir -p tmp/pids log bin
chmod -R a+w tmp/pids log
touch log/{app,delayed_job}.log
# place delayed_job.rb script in ./bin/delayed_job
@diedthreetimes
Copy link

diedthreetimes commented Sep 22, 2024

With ActiveRecord >= 6.0 the above is no longer enough. Easiest solution is to apply this fix.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment