module Scheduler::Deferrable

Public Class Methods

new() click to toggle source
# File lib/scheduler/defer.rb, line 3
def initialize
  @async = !Rails.env.test?
  @queue = Queue.new
  @mutex = Mutex.new
  @paused = false
  @thread = nil
end

Public Instance Methods

async=(val) click to toggle source

for test

# File lib/scheduler/defer.rb, line 21
def async=(val)
  @async = val
end
do_all_work() click to toggle source
# File lib/scheduler/defer.rb, line 44
def do_all_work
  while !@queue.empty?
    do_work(_non_block=true)
  end
end
later(desc = nil, db=Scheduler.configuration.current_db, &blk) click to toggle source
# File lib/scheduler/defer.rb, line 25
def later(desc = nil, db=Scheduler.configuration.current_db, &blk)
  if @async
    start_thread unless (@thread && @thread.alive?) || @paused
    @queue << [db, blk, desc]
  else
    blk.call
  end
end
pause() click to toggle source
# File lib/scheduler/defer.rb, line 11
def pause
  stop!
  @paused = true
end
resume() click to toggle source
# File lib/scheduler/defer.rb, line 16
def resume
  @paused = false
end
stop!() click to toggle source
# File lib/scheduler/defer.rb, line 34
def stop!
  @thread.kill if @thread && @thread.alive?
  @thread = nil
end
stopped?() click to toggle source

test only

# File lib/scheduler/defer.rb, line 40
def stopped?
  !(@thread && @thread.alive?)
end

Private Instance Methods

do_work(non_block=false) click to toggle source

using non_block to match Ruby deq

# File lib/scheduler/defer.rb, line 64
def do_work(non_block=false)
  db, job, desc = @queue.deq(non_block)
  begin
    Scheduler::Connection.establish_connection(db: db) if db
    job.call
  rescue => ex
    Scheduler.handle_job_exception(ex, {message: "Running deferred code '#{desc}'"})
  end
rescue => ex
  Scheduler.handle_job_exception(ex, {message: "Processing deferred code queue"})
ensure
  ActiveRecord::Base.connection_handler.clear_active_connections!
end
start_thread() click to toggle source
# File lib/scheduler/defer.rb, line 52
def start_thread
  @mutex.synchronize do
    return if @thread && @thread.alive?
    @thread = Thread.new {
      while true
        do_work
      end
    }
  end
end