Sha256: 381a3c7894caacebc028768aed8a9e67bf0ca9997204229c492ef44b9e1597dc

Contents?: true

Size: 1.62 KB

Versions: 27

Compression:

Stored size: 1.62 KB

Contents

module Shoryuken
  module Middleware
    module Server
      class AutoExtendVisibility
        include Util

        EXTEND_UPFRONT_SECONDS = 5

        def call(worker, queue, sqs_msg, body)
          return yield unless worker.class.auto_visibility_timeout?

          if sqs_msg.is_a?(Array)
            logger.warn { "Auto extend visibility isn't supported for batch workers" }
            return yield
          end

          timer = auto_visibility_timer(worker, queue, sqs_msg, body)
          yield
        ensure
          timer.kill if timer
        end

        private

        class MessageVisibilityExtender
          include Util

          def auto_extend(_worker, queue, sqs_msg, _body)
            queue_visibility_timeout = Shoryuken::Client.queues(queue).visibility_timeout

            Concurrent::TimerTask.new(execution_interval: queue_visibility_timeout - EXTEND_UPFRONT_SECONDS) do
              begin
                logger.debug do
                  "Extending message #{queue}/#{sqs_msg.message_id} visibility timeout by #{queue_visibility_timeout}s"
                end

                sqs_msg.change_visibility(visibility_timeout: queue_visibility_timeout)
              rescue => ex
                logger.error do
                  "Could not auto extend the message #{queue}/#{sqs_msg.message_id} visibility timeout. Error: #{ex.message}"
                end
              end
            end
          end
        end

        def auto_visibility_timer(worker, queue, sqs_msg, body)
          MessageVisibilityExtender.new.auto_extend(worker, queue, sqs_msg, body).tap(&:execute)
        end
      end
    end
  end
end

Version data entries

27 entries across 27 versions & 1 rubygems

Version Path
shoryuken-6.2.1 lib/shoryuken/middleware/server/auto_extend_visibility.rb
shoryuken-6.2.0 lib/shoryuken/middleware/server/auto_extend_visibility.rb
shoryuken-6.1.1 lib/shoryuken/middleware/server/auto_extend_visibility.rb
shoryuken-6.1.0 lib/shoryuken/middleware/server/auto_extend_visibility.rb
shoryuken-6.0.0 lib/shoryuken/middleware/server/auto_extend_visibility.rb
shoryuken-5.3.2 lib/shoryuken/middleware/server/auto_extend_visibility.rb
shoryuken-5.3.1 lib/shoryuken/middleware/server/auto_extend_visibility.rb
shoryuken-5.3.0 lib/shoryuken/middleware/server/auto_extend_visibility.rb
shoryuken-5.2.3 lib/shoryuken/middleware/server/auto_extend_visibility.rb
shoryuken-5.2.2 lib/shoryuken/middleware/server/auto_extend_visibility.rb
shoryuken-5.2.1 lib/shoryuken/middleware/server/auto_extend_visibility.rb
shoryuken-5.2.0 lib/shoryuken/middleware/server/auto_extend_visibility.rb
shoryuken-5.1.1 lib/shoryuken/middleware/server/auto_extend_visibility.rb
shoryuken-5.1.0 lib/shoryuken/middleware/server/auto_extend_visibility.rb
shoryuken-5.0.6 lib/shoryuken/middleware/server/auto_extend_visibility.rb
shoryuken-5.0.5 lib/shoryuken/middleware/server/auto_extend_visibility.rb
shoryuken-5.0.4 lib/shoryuken/middleware/server/auto_extend_visibility.rb
shoryuken-5.0.3 lib/shoryuken/middleware/server/auto_extend_visibility.rb
shoryuken-5.0.2 lib/shoryuken/middleware/server/auto_extend_visibility.rb
shoryuken-5.0.1 lib/shoryuken/middleware/server/auto_extend_visibility.rb