mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
41 lines
1.3 KiB
Ruby
41 lines
1.3 KiB
Ruby
module ActionCable
|
|
module Channel
|
|
module PeriodicTimers
|
|
extend ActiveSupport::Concern
|
|
|
|
included do
|
|
class_attribute :periodic_timers, instance_reader: false
|
|
self.periodic_timers = []
|
|
|
|
after_subscribe :start_periodic_timers
|
|
after_unsubscribe :stop_periodic_timers
|
|
end
|
|
|
|
module ClassMethods
|
|
# Allow you to call a private method <tt>every</tt> so often seconds. This periodic timer can be useful
|
|
# for sending a steady flow of updates to a client based off an object that was configured on subscription.
|
|
# It's an alternative to using streams if the channel is able to do the work internally.
|
|
def periodically(callback, every:)
|
|
self.periodic_timers += [ [ callback, every: every ] ]
|
|
end
|
|
end
|
|
|
|
private
|
|
def active_periodic_timers
|
|
@active_periodic_timers ||= []
|
|
end
|
|
|
|
def start_periodic_timers
|
|
self.class.periodic_timers.each do |callback, options|
|
|
active_periodic_timers << Concurrent::TimerTask.new(execution_interval: options[:every]) do
|
|
connection.worker_pool.async_run_periodic_timer(self, callback)
|
|
end
|
|
end
|
|
end
|
|
|
|
def stop_periodic_timers
|
|
active_periodic_timers.each { |timer| timer.shutdown }
|
|
end
|
|
end
|
|
end
|
|
end
|