Class: BugBunny::ConsumerMiddleware::Stack

Inherits:
Object
  • Object
show all
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

Constructor Details

#initializeStack

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.

Parameters:

  • delivery_info (Bunny::DeliveryInfo)
  • properties (Bunny::MessageProperties)
  • body (String)

Yield Returns:

  • (void)

    El bloque core a ejecutar al final de la cadena.



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.

Returns:

  • (Boolean)

    ‘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.

Parameters:

  • middleware_class (Class)

    Clase que hereda de Base.

Returns:

  • (self)


59
60
61
62
# File 'lib/bug_bunny/consumer_middleware.rb', line 59

def use(middleware_class)
  @mutex.synchronize { @middlewares << middleware_class }
  self
end