ActiveSupport::Subscriber (original) (raw)
Active Support Subscriber
ActiveSupport::Subscriber is an object set to consume ActiveSupport::Notifications. The subscriber dispatches notifications to a registered object based on its given namespace.
An example would be an Active Record subscriber responsible for collecting statistics about queries:
module ActiveRecord
class StatsSubscriber < ActiveSupport::Subscriber
attach_to :active_record
def sql(event)
Statsd.timing("sql.#{event.payload[:name]}", event.duration)
end
end
end
After configured, whenever a "sql.active_record"
notification is published, it will properly dispatch the event (ActiveSupport::Notifications::Event) to the sql
method.
We can detach a subscriber as well:
ActiveRecord::StatsSubscriber.detach_from(:active_record)
Methods
A
C
D
M
N
R
S
Class Public methods
attach_to(namespace, subscriber = new, notifier = ActiveSupport::Notifications, inherit_all: false)Link
Attach the subscriber to a namespace.
def attach_to(namespace, subscriber = new, notifier = ActiveSupport::Notifications, inherit_all: false) @namespace = namespace @subscriber = subscriber @notifier = notifier @inherit_all = inherit_all
subscribers << subscriber
fetch_public_methods(subscriber, inherit_all).each do |event| add_event_subscriber(event) end end
detach_from(namespace, notifier = ActiveSupport::Notifications)Link
Detach the subscriber from a namespace.
def detach_from(namespace, notifier = ActiveSupport::Notifications) @namespace = namespace @subscriber = find_attached_subscriber @notifier = notifier
return unless subscriber
subscribers.delete(subscriber)
fetch_public_methods(subscriber, true).each do |event| remove_event_subscriber(event) end
@notifier = nil end
method_added(event)Link
Adds event subscribers for all new methods added to the class.
def method_added(event) super
if public_method_defined?(event) && notifier add_event_subscriber(event) end end
Class Private methods
add_event_subscriber(event)Link
def add_event_subscriber(event) return if invalid_event?(event)
pattern = prepare_pattern(event)
return if pattern_subscribed?(pattern)
subscriber.patterns[pattern] = notifier.subscribe(pattern, subscriber) end
remove_event_subscriber(event)Link
def remove_event_subscriber(event) return if invalid_event?(event)
pattern = prepare_pattern(event)
return unless pattern_subscribed?(pattern)
notifier.unsubscribe(subscriber.patterns[pattern]) subscriber.patterns.delete(pattern) end
Instance Public methods
call(event)Link
def call(event) method = event.name[0, event.name.index(".")] send(method, event) end