class Sidekiq::Middleware::Chain
Public Instance Methods
Add the given middleware to the end of the chain. Sidekiq
will call ‘klass.new(*args)` to create a clean copy of your middleware for every job executed.
chain.add(Statsd::Metrics, { collector: "localhost:8125" })
@param klass [Class] Your middleware class @param *args [Array<Object>] Set of arguments to pass to every instance of your middleware
# File lib/sidekiq/middleware/chain.rb, line 119 def add(klass, *args) remove(klass) entries << Entry.new(@config, klass, *args) end
# File lib/sidekiq/middleware/chain.rb, line 163 def clear entries.clear end
# File lib/sidekiq/middleware/chain.rb, line 99 def copy_for(capsule) chain = Sidekiq::Middleware::Chain.new(capsule) chain.instance_variable_set(:@entries, entries.dup) chain end
Iterate through each middleware in the chain
# File lib/sidekiq/middleware/chain.rb, line 84 def each(&block) entries.each(&block) end
@return [Boolean] if the chain contains no middleware
# File lib/sidekiq/middleware/chain.rb, line 155 def empty? @entries.nil? || @entries.empty? end
# File lib/sidekiq/middleware/chain.rb, line 95 def entries @entries ||= [] end
@return [Boolean] if the given class is already in the chain
# File lib/sidekiq/middleware/chain.rb, line 149 def exists?(klass) any? { |entry| entry.klass == klass } end
Inserts newklass
after oldklass
in the chain. Useful if one middleware must run after another middleware.
# File lib/sidekiq/middleware/chain.rb, line 141 def insert_after(oldklass, newklass, *args) i = entries.index { |entry| entry.klass == newklass } new_entry = i.nil? ? Entry.new(@config, newklass, *args) : entries.delete_at(i) i = entries.index { |entry| entry.klass == oldklass } || entries.count - 1 entries.insert(i + 1, new_entry) end
Inserts newklass
before oldklass
in the chain. Useful if one middleware must run before another middleware.
# File lib/sidekiq/middleware/chain.rb, line 132 def insert_before(oldklass, newklass, *args) i = entries.index { |entry| entry.klass == newklass } new_entry = i.nil? ? Entry.new(@config, newklass, *args) : entries.delete_at(i) i = entries.index { |entry| entry.klass == oldklass } || 0 entries.insert(i, new_entry) end
Used by Sidekiq
to execute the middleware at runtime @api private
# File lib/sidekiq/middleware/chain.rb, line 169 def invoke(*args, &block) return yield if empty? chain = retrieve traverse(chain, 0, args, &block) end
Identical to {#add} except the middleware is added to the front of the chain.
# File lib/sidekiq/middleware/chain.rb, line 125 def prepend(klass, *args) remove(klass) entries.insert(0, Entry.new(@config, klass, *args)) end
Remove all middleware matching the given Class @param klass [Class]
# File lib/sidekiq/middleware/chain.rb, line 107 def remove(klass) entries.delete_if { |entry| entry.klass == klass } end
# File lib/sidekiq/middleware/chain.rb, line 159 def retrieve map(&:make_new) end
Private Instance Methods
# File lib/sidekiq/middleware/chain.rb, line 178 def traverse(chain, index, args, &block) if index >= chain.size yield else chain[index].call(*args) do traverse(chain, index + 1, args, &block) end end end