# class Puppet::Indirector::Queue

Implements the `:queue` abstract indirector terminus type, for storing model instances to a message queue, presumably for the purpose of out-of-process handling of changes related to the model.

Relies upon Puppet::Util::Queue for registry and client object management, and specifies a default queue type of `:stomp`, appropriate for use with a variety of message brokers.

It’s up to the queue client type to instantiate itself correctly based on Puppet configuration information.

A single queue client is maintained for the abstract terminus, meaning that you can only use one type of queue client, one message broker solution, etc., with the indirection mechanism.

Per-indirection queues are assumed, based on the indirection name. If the `:catalog` indirection makes use of this `:queue` terminus, queue operations work against the “catalog” queue. It is up to the queue client library to handle queue creation as necessary (for a number of popular queuing solutions, queue creation is automatic and not a concern).

### Public Class Methods

intern(message) click to toggle source

converts the message from deserialized format to an actual model instance.

    # File lib/puppet/indirector/queue.rb, line 59
    def self.intern(message)
      result = nil
      benchmark :info, "Loaded queued #{indirection.name}" do
        result = model.convert_from(:pson, message)
      end
      result
    end

new(*args) click to toggle source
Calls superclass method Puppet::Indirector::Terminus.new

    # File lib/puppet/indirector/queue.rb, line 25
    def initialize(*args)
      super
    end

queue() click to toggle source

    # File lib/puppet/indirector/queue.rb, line 45
    def self.queue
      indirection_name
    end

subscribe() { |intern| ... } click to toggle source

Provides queue subscription functionality; for a given indirection, use this method on the terminus to subscribe to the indirection-specific queue. Your block will be executed per new indirection model received from the queue, with obj being the model instance.

    # File lib/puppet/indirector/queue.rb, line 70
    def self.subscribe
      client.subscribe(queue) do |msg|
        begin
          yield(self.intern(msg))
        rescue => detail
          Puppet.log_exception(detail, "Error occured with subscription to queue #{queue} for indirection #{indirection_name}: #{detail}")
        end
      end
    end

### Public Instance Methods

client() click to toggle source

Returns the singleton queue client object.

    # File lib/puppet/indirector/queue.rb, line 54
    def client
      self.class.client
    end

find(request) click to toggle source

Queue has no idiomatic "find"

    # File lib/puppet/indirector/queue.rb, line 30
    def find(request)
      nil
    end

queue() click to toggle source

    # File lib/puppet/indirector/queue.rb, line 49
    def queue
      self.class.queue
    end

save(request) click to toggle source

Place the request on the queue

    # File lib/puppet/indirector/queue.rb, line 35
    def save(request)
        result = nil
        benchmark :info, "Queued #{indirection.name} for #{request.key}" do
          result = client.publish_message(queue, request.instance.render(:pson))
        end
        result
    rescue => detail
        raise Puppet::Error, "Could not write #{request.key} to queue: #{detail}\nInstance::#{request.instance}\n client : #{client}"
    end