Class: Maitredee::Subscriber

Inherits:
Object
  • Object
show all
Extended by:
Adapters::TestAdapter::SubscriberTesting
Defined in:
lib/maitredee/subscriber.rb

Overview

Inherit from this class to easily subscrive to messages:

class RecipeSubscriber < Maitredee::Subscriber
  # this is the topic name
  subscribe_to :recipes do

    # this is the event name optionally say which method to use to process
    event(:create, to: create)

    # event_name will be used as the method name if it is a valid method name, otherwise to: must be set
    event(:delete)

    # for empty event name just use nil
    event(nil, to: :process)

    # you can specify a catch all route
    default_event to: :process
  end

  # optional initializer to do message pre processing
  # def initialize(message)
  #   super
  #   # do business here
  # end

  def create
    Recipe.create!(message.body)
  end

  def process
    Recipe.find(message.body[:id]).update(message.body)
  end

  def delete
    Recipe.find(message.body[:id]).destroy
  end
end

Defined Under Namespace

Classes: EventConfig, SubscriberProxy

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Adapters::TestAdapter::SubscriberTesting

test

Constructor Details

#initialize(message) ⇒ Subscriber

Returns a new instance of Subscriber.

Parameters:



159
160
161
# File 'lib/maitredee/subscriber.rb', line 159

def initialize(message)
  @message = message
end

Class Attribute Details

.topic_nameObject (readonly)

Returns the value of attribute topic_name.



88
89
90
# File 'lib/maitredee/subscriber.rb', line 88

def topic_name
  @topic_name
end

Instance Attribute Details

#messageSubscriberMessage (readonly)

Returns:



156
157
158
# File 'lib/maitredee/subscriber.rb', line 156

def message
  @message
end

Class Method Details

.process(message) ⇒ Object

takes message and routes it based off SubscriberMessage#event_name

Parameters:



147
148
149
150
151
152
# File 'lib/maitredee/subscriber.rb', line 147

def process(message)
  event_config = event_configs[message.event_name.to_s]
  if event_config
    new(message).send(event_config.action)
  end
end

.queue_nameObject

returns the queue_name set in .subscribe_to or is generated off the class name without Subscriber



135
136
137
# File 'lib/maitredee/subscriber.rb', line 135

def queue_name
  @queue_name ||= name.chomp(Subscriber.name.demodulize).underscore.dasherize
end

.queue_resource_nameString

Returns the resource name of the queue depending on the adapter

Returns:

  • (String)


141
142
143
# File 'lib/maitredee/subscriber.rb', line 141

def queue_resource_name
  @queue_resource_name ||= Maitredee.queue_resource_name(topic_name, queue_name)
end

.subscribe_to(topic_name, queue_name: nil, queue_resource_name: nil, &block) ⇒ Object

configures Subscriber to which topic it should listen to and lets you configure events in the block

Examples:

subscribe to a topic

class RecipeSubscriber < Maitredee::Subscriber
  subscribe_to :recipes do
    event(:delete) # by default this calls the event_name, #delete
    event(:update, to: :process) # events can be routed to different methods though
    event(nil, to: :process) # subscribe without event names

    default_event(to: :process) # this will default a catch all route
  end

  def delete
    # do some work
  end

  def process
    # do some work
  end
end

Parameters:

  • topic_name (#to_s)
  • queue_name (#to_s) (defaults to: nil)

    overide default generation from class name

  • queue_resource_name (#to_s) (defaults to: nil)

    overide default generation from queue_name and topic_name

See Also:



114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/maitredee/subscriber.rb', line 114

def subscribe_to(topic_name, queue_name: nil, queue_resource_name: nil, &block)
  @topic_name = topic_name
  @queue_name = queue_name if queue_name
  @queue_resource_name = queue_resource_name if queue_resource_name

  proxy = SubscriberProxy.new(self)
  proxy.instance_eval(&block)

  if event_configs.empty? && event_configs.default.nil?
    raise Maitredee::NoRoutesError, "No events routed"
  end

  Maitredee.register_subscriber(self)
end