класс ActiveSupport::Subscriber
ActiveSupport::Subscriber — это объект, предназначенный для потребления ActiveSupport::Notifications. Подписчик рассылает уведомления зарегистрированному объекту на основе заданного пространства имён.
Например, подписчик Active Record, отвечающий за сбор статистики о запросах:
module ActiveRecord
class StatsSubscriber < ActiveSupport::Subscriber
attach_to :active_record
def sql(event)
Statsd.timing("sql.#{event.payload[:name]}", event.duration)
end
end
end
После настройки, всякий раз, когда публикуется уведомление «sql.active_record», оно будет корректно передаваться методу sql.
Атрибуты
TODO Изменить на private, как только мы откажемся от поддержки Ruby 2.2. Обходной путь для предупреждения Ruby 2.2 «private attribute?».
TODO Изменить на private, как только мы откажемся от поддержки Ruby 2.2. Обходной путь для предупреждения Ruby 2.2 «private attribute?».
TODO Изменить на private, как только мы откажемся от поддержки Ruby 2.2. Обходной путь для предупреждения Ruby 2.2 «private attribute?».
Публичные методы класса
# File activesupport/lib/active_support/subscriber.rb, line 28
def attach_to(namespace, subscriber = new, notifier = ActiveSupport::Notifications)
@namespace = namespace
@subscriber = subscriber
@notifier = notifier
subscribers << subscriber
# Add event subscribers for all existing methods on the class.
subscriber.public_methods(false).each do |event|
add_event_subscriber(event)
end
end Присоединить подписчика к пространству имён.
# File activesupport/lib/active_support/subscriber.rb, line 42
def method_added(event)
# Only public methods are added as subscribers, and only if a notifier
# has been set up. This means that subscribers will only be set up for
# classes that call #attach_to.
if public_method_defined?(event) && notifier
add_event_subscriber(event)
end
end Добавляет подписчиков событий для всех новых методов, добавленных в класс.
# File activesupport/lib/active_support/subscriber.rb, line 78 def initialize @queue_key = [self.class.name, object_id].join "-" @patterns = [] super end
# File activesupport/lib/active_support/subscriber.rb, line 51 def subscribers @@subscribers ||= [] end
Приватные методы класса
# File activesupport/lib/active_support/subscriber.rb, line 63
def add_event_subscriber(event) # :doc:
return if %w{ start finish }.include?(event.to_s)
pattern = "#{event}.#{namespace}"
# Don't add multiple subscribers (eg. if methods are redefined).
return if subscriber.patterns.include?(pattern)
subscriber.patterns << pattern
notifier.subscribe(pattern, subscriber)
end Публичные методы экземпляра
# File activesupport/lib/active_support/subscriber.rb, line 92
def finish(name, id, payload)
finished = Time.now
event = event_stack.pop
event.end = finished
event.payload.merge!(payload)
method = name.split(".".freeze).first
send(method, event)
end # File activesupport/lib/active_support/subscriber.rb, line 84 def start(name, id, payload) e = ActiveSupport::Notifications::Event.new(name, Time.now, nil, id, payload) parent = event_stack.last parent << e if parent event_stack.push e end
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.