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

Add chain#add_before and chain#add_after to facilitate insertion into the middle of the Middleware chains.

This commit is contained in:
Jack Royal-Gordon 2012-12-18 21:42:23 -08:00
parent 4895687bc5
commit 7b5c3b02cb
2 changed files with 55 additions and 1 deletions

View file

@ -23,6 +23,22 @@ module Sidekiq
# end
# end
#
# To insert immediately preceding another entry:
#
# Sidekiq.configure_client do |config|
# config.client_middleware do |chain|
# chain.add_before ActiveRecord, MyClientHook
# end
# end
#
# To insert immediately after another entry:
#
# Sidekiq.configure_client do |config|
# config.client_middleware do |chain|
# chain.add_after ActiveRecord, MyClientHook
# end
# end
#
# This is an example of a minimal server middleware:
#
# class MyServerHook
@ -60,6 +76,16 @@ module Sidekiq
entries << Entry.new(klass, *args) unless exists?(klass)
end
def add_before(oldklass, newklass, *args)
i = entries.find_index { |entry| entry.klass == oldklass } || 0
entries.insert(i, Entry.new(klass, *args)) unless exists?(klass)
end
def add_after(oldklass, newklass, *args)
i = entries.find_index { |entry| entry.klass == oldklass } || entries.count - 1
entries.insert(i+1, Entry.new(klass, *args)) unless exists?(klass)
end
def exists?(klass)
entries.any? { |entry| entry.klass == klass }
end

View file

@ -41,6 +41,32 @@ class TestMiddleware < MiniTest::Unit::TestCase
def call(*args)
end
end
class AnotherCustomMiddleware
def initialize(name, recorder)
@name = name
@recorder = recorder
end
def call(*args)
@recorder << [@name, 'before']
yield
@recorder << [@name, 'after']
end
end
class YetAnotherCustomMiddleware
def initialize(name, recorder)
@name = name
@recorder = recorder
end
def call(*args)
@recorder << [@name, 'before']
yield
@recorder << [@name, 'after']
end
end
it 'executes middleware in the proper order' do
msg = Sidekiq.dump_json({ 'class' => CustomWorker.to_s, 'args' => [$recorder] })
@ -48,6 +74,8 @@ class TestMiddleware < MiniTest::Unit::TestCase
Sidekiq.server_middleware do |chain|
# should only add once, second should be ignored
2.times { |i| chain.add CustomMiddleware, i.to_s, $recorder }
chain.add_before CustomMiddleware, AnotherCustomMiddleware, '2', $recorder
chain.add_after AnotherCustomMiddleware, YetAnotherCustomMiddleware, '3', $recorder
end
boss = MiniTest::Mock.new
@ -56,7 +84,7 @@ class TestMiddleware < MiniTest::Unit::TestCase
actor.expect(:processor_done, nil, [processor])
boss.expect(:async, actor, [])
processor.process(msg, 'default')
assert_equal %w(0 before work_performed 0 after), $recorder.flatten
assert_equal %w(2 before 3 before 0 before work_performed 0 after 3 after 2 after), $recorder.flatten
end
it 'allows middleware to abruptly stop processing rest of chain' do