Class: Sidekiq::Middleware::Chain

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/sidekiq/middleware/chain.rb

Instance Method Summary collapse

Constructor Details

#initialize(config = nil) {|_self| ... } ⇒ Chain

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a new instance of Chain.

Yields:

  • (_self)

Yield Parameters:



89
90
91
92
93
# File 'lib/sidekiq/middleware/chain.rb', line 89

def initialize(config = nil) # :nodoc:
  @config = config
  @entries = nil
  yield self if block_given?
end

Instance Method Details

#add(klass, *args) ⇒ Object

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" })

Parameters:

  • klass (Class)

    Your middleware class

  • *args (Array<Object>)

    Set of arguments to pass to every instance of your middleware



119
120
121
122
# File 'lib/sidekiq/middleware/chain.rb', line 119

def add(klass, *args)
  remove(klass)
  entries << Entry.new(@config, klass, *args)
end

#clearObject



163
164
165
# File 'lib/sidekiq/middleware/chain.rb', line 163

def clear
  entries.clear
end

#copy_for(capsule) ⇒ Object



99
100
101
102
103
# 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

#each(&block) ⇒ Object

Iterate through each middleware in the chain



84
85
86
# File 'lib/sidekiq/middleware/chain.rb', line 84

def each(&block)
  entries.each(&block)
end

#empty?Boolean

Returns if the chain contains no middleware.

Returns:

  • (Boolean)

    if the chain contains no middleware



155
156
157
# File 'lib/sidekiq/middleware/chain.rb', line 155

def empty?
  @entries.nil? || @entries.empty?
end

#entriesObject



95
96
97
# File 'lib/sidekiq/middleware/chain.rb', line 95

def entries
  @entries ||= []
end

#exists?(klass) ⇒ Boolean Also known as: include?

Returns if the given class is already in the chain.

Returns:

  • (Boolean)

    if the given class is already in the chain



149
150
151
# File 'lib/sidekiq/middleware/chain.rb', line 149

def exists?(klass)
  any? { |entry| entry.klass == klass }
end

#insert_after(oldklass, newklass, *args) ⇒ Object

Inserts newklass after oldklass in the chain. Useful if one middleware must run after another middleware.



141
142
143
144
145
146
# 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

#insert_before(oldklass, newklass, *args) ⇒ Object

Inserts newklass before oldklass in the chain. Useful if one middleware must run before another middleware.



132
133
134
135
136
137
# 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

#invoke(*args, &block) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Used by Sidekiq to execute the middleware at runtime



169
170
171
172
173
174
# File 'lib/sidekiq/middleware/chain.rb', line 169

def invoke(*args, &block)
  return yield if empty?

  chain = retrieve
  traverse(chain, 0, args, &block)
end

#prepend(klass, *args) ⇒ Object

Identical to #add except the middleware is added to the front of the chain.



125
126
127
128
# File 'lib/sidekiq/middleware/chain.rb', line 125

def prepend(klass, *args)
  remove(klass)
  entries.insert(0, Entry.new(@config, klass, *args))
end

#remove(klass) ⇒ Object

Remove all middleware matching the given Class

Parameters:

  • klass (Class)


107
108
109
# File 'lib/sidekiq/middleware/chain.rb', line 107

def remove(klass)
  entries.delete_if { |entry| entry.klass == klass }
end

#retrieveObject



159
160
161
# File 'lib/sidekiq/middleware/chain.rb', line 159

def retrieve
  map(&:make_new)
end