Class: BugBunny::ConsumerMiddleware::Stack
- Inherits:
-
Object
- Object
- BugBunny::ConsumerMiddleware::Stack
- Defined in:
- lib/bug_bunny/consumer_middleware.rb
Overview
Gestiona y ejecuta la cadena de middlewares del Consumer.
Thread-safe: ‘use` y `empty?` están protegidos por un Mutex. `call` toma un snapshot del array bajo mutex y ejecuta la cadena fuera del lock para no serializar el procesamiento de mensajes.
Instance Method Summary collapse
-
#call(delivery_info, properties, body, &core) ⇒ void
Ejecuta la cadena de middlewares envolviendo el bloque core.
-
#empty? ⇒ Boolean
‘true` si no hay middlewares registrados.
-
#initialize ⇒ Stack
constructor
A new instance of Stack.
-
#use(middleware_class) ⇒ self
Registra un middleware en la cadena.
Constructor Details
#initialize ⇒ Stack
Returns a new instance of Stack.
50 51 52 53 |
# File 'lib/bug_bunny/consumer_middleware.rb', line 50 def initialize @middlewares = [] @mutex = Mutex.new end |
Instance Method Details
#call(delivery_info, properties, body, &core) ⇒ void
This method returns an undefined value.
Ejecuta la cadena de middlewares envolviendo el bloque core.
Toma un snapshot del array de middlewares bajo mutex y construye la cadena fuera del lock para no bloquear registros concurrentes durante la ejecución.
79 80 81 82 83 84 85 86 87 88 |
# File 'lib/bug_bunny/consumer_middleware.rb', line 79 def call(delivery_info, properties, body, &core) snapshot = @mutex.synchronize { @middlewares.dup } terminal = ->(_di, _props, _body) { core.call } chain = snapshot.reverse.inject(terminal) do |next_step, middleware_class| middleware_class.new(next_step) end chain.call(delivery_info, properties, body) end |
#empty? ⇒ Boolean
Returns ‘true` si no hay middlewares registrados. Thread-safe.
65 66 67 |
# File 'lib/bug_bunny/consumer_middleware.rb', line 65 def empty? @mutex.synchronize { @middlewares.empty? } end |
#use(middleware_class) ⇒ self
Registra un middleware en la cadena. Thread-safe.
59 60 61 62 |
# File 'lib/bug_bunny/consumer_middleware.rb', line 59 def use(middleware_class) @mutex.synchronize { @middlewares << middleware_class } self end |