mirror of
https://github.com/mperham/sidekiq.git
synced 2022-11-09 13:52:34 -05:00
Merge pull request #595 from jackrg/master
Add new middleware chain methods for insertion into the middle of the list
This commit is contained in:
commit
92a26bc3b5
2 changed files with 57 additions and 1 deletions
|
@ -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.insert_before ActiveRecord, MyClientHook
|
||||
# end
|
||||
# end
|
||||
#
|
||||
# To insert immediately after another entry:
|
||||
#
|
||||
# Sidekiq.configure_client do |config|
|
||||
# config.client_middleware do |chain|
|
||||
# chain.insert_after ActiveRecord, MyClientHook
|
||||
# end
|
||||
# end
|
||||
#
|
||||
# This is an example of a minimal server middleware:
|
||||
#
|
||||
# class MyServerHook
|
||||
|
@ -60,6 +76,18 @@ module Sidekiq
|
|||
entries << Entry.new(klass, *args) unless exists?(klass)
|
||||
end
|
||||
|
||||
def insert_before(oldklass, newklass, *args)
|
||||
new_entry = entries.delete_if { |entry| entry.klass == newklass } || Entry.new(newklass, *args)
|
||||
i = entries.find_index { |entry| entry.klass == oldklass } || 0
|
||||
entries.insert(i, new_entry)
|
||||
end
|
||||
|
||||
def insert_after(oldklass, newklass, *args)
|
||||
new_entry = entries.delete_if { |entry| entry.klass == newklass } || Entry.new(newklass, *args)
|
||||
i = entries.find_index { |entry| entry.klass == oldklass } || entries.count - 1
|
||||
entries.insert(i+1, new_entry)
|
||||
end
|
||||
|
||||
def exists?(klass)
|
||||
entries.any? { |entry| entry.klass == klass }
|
||||
end
|
||||
|
|
|
@ -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.insert_before CustomMiddleware, AnotherCustomMiddleware, '2', $recorder
|
||||
chain.insert_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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue