mirror of
https://github.com/codeninjasllc/discourse.git
synced 2024-11-23 23:58:31 -05:00
2c8ae22b87
For quick jobs that do not need to be sent to sidekiq, runs inline in a single thread but does not block
48 lines
827 B
Ruby
48 lines
827 B
Ruby
module Scheduler
|
|
module Deferrable
|
|
def initialize
|
|
@async = Rails.env != "test"
|
|
@queue = Queue.new
|
|
@thread = Thread.new {
|
|
while true
|
|
do_work
|
|
end
|
|
}
|
|
end
|
|
|
|
# for test
|
|
def async=(val)
|
|
@async = val
|
|
end
|
|
|
|
def later(&blk)
|
|
if @async
|
|
@queue << [RailsMultisite::ConnectionManagement.current_db, blk]
|
|
else
|
|
blk.call
|
|
end
|
|
end
|
|
|
|
def stop!
|
|
@thread.kill
|
|
end
|
|
|
|
private
|
|
|
|
def do_work
|
|
db, job = @queue.deq
|
|
RailsMultisite::ConnectionManagement.establish_connection(db: db)
|
|
job.call
|
|
rescue => ex
|
|
Discourse.handle_exception(ex)
|
|
ensure
|
|
ActiveRecord::Base.connection_handler.clear_active_connections!
|
|
end
|
|
|
|
end
|
|
|
|
class Defer
|
|
extend Deferrable
|
|
initialize
|
|
end
|
|
end
|