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