1
0
Fork 0
mirror of https://github.com/mperham/sidekiq.git synced 2022-11-09 13:52:34 -05:00
mperham--sidekiq/lib/sidekiq/middleware/chain.rb

93 lines
2 KiB
Ruby
Raw Normal View History

2012-02-08 20:04:19 -05:00
module Sidekiq
# Middleware is code configured to run before/after
# a message is processed. It is patterned after Rack
# middleware. Middleware exists for the client side
# (pushing jobs onto the queue) as well as the server
# side (when jobs are actually processed).
2012-02-08 20:04:19 -05:00
#
# To add middleware for the client:
2012-02-08 20:04:19 -05:00
#
# Sidekiq.client_middleware do |chain|
2012-02-18 16:08:53 -05:00
# chain.add MyClientHook
2012-02-08 20:04:19 -05:00
# end
#
# To modify middleware for the server, just call
# with another block:
2012-02-08 20:04:19 -05:00
#
2012-02-18 16:08:53 -05:00
# Sidekiq.server_middleware do |chain|
# chain.add MyServerHook
# chain.remove ActiveRecord
2012-02-08 20:04:19 -05:00
# end
#
2012-02-18 16:08:53 -05:00
# This is an example of a minimal server middleware:
2012-02-08 20:04:19 -05:00
#
# class MyServerHook
# def call(worker, msg, queue)
2012-02-08 20:04:19 -05:00
# puts "Before work"
# yield
# puts "After work"
# end
# end
#
2012-02-18 16:08:53 -05:00
# This is an example of a minimal client middleware:
#
# class MyClientHook
# def call(msg, queue)
# puts "Before push"
# yield
# puts "After push"
# end
# end
#
2012-02-08 20:04:19 -05:00
module Middleware
class Chain
attr_reader :entries
def initialize
@entries = []
yield self if block_given?
2012-02-08 20:04:19 -05:00
end
def remove(klass)
2012-02-08 20:04:19 -05:00
entries.delete_if { |entry| entry.klass == klass }
end
def add(klass, *args)
entries << Entry.new(klass, *args) unless exists?(klass)
end
def exists?(klass)
entries.any? { |entry| entry.klass == klass }
2012-02-08 20:04:19 -05:00
end
def retrieve
entries.map(&:make_new)
end
def invoke(*args, &final_action)
chain = retrieve.dup
traverse_chain = lambda do
if chain.empty?
final_action.call
else
chain.shift.call(*args, &traverse_chain)
end
end
traverse_chain.call
end
end
class Entry
attr_reader :klass
def initialize(klass, *args)
@klass = klass
@args = args
end
def make_new
@klass.new(*@args)
end
end
end
end