Sha256: 6abaf1a8f0113b5848baea6cd18756f93067d9f799588b2b476b7ece84a3668c

Contents?: true

Size: 1.48 KB

Versions: 4

Compression:

Stored size: 1.48 KB

Contents

module LiveQA
  module Processor
    class Batch

      attr_reader :messages

      MAX_BYTES = 204_800 # 200Kb
      MAX_MESSAGES = 100
      MAX_MESSAGE_BYTES = 32_768 # 32Kb

      MAX_RETRY = 10
      RETRY_MAP = {
        1 => 2,
        2 => 5,
        3 => 10,
        4 => 20,
        5 => 30,
        6 => 30,
        7 => 30,
        8 => 30,
        9 => 30,
        10 => 30,
      }.freeze

      def initialize
        @retry_count = 0
        @total_bytes = 0
        @messages = []
      end

      def <<(message)
        message_json_size = message.to_json.bytesize

        if max_message_reached?(message_json_size)
          LiveQA.configurations.logger.error('Message is too big to be send')
          return false
        end

        @total_bytes += message_json_size

        @messages << message

        true
      end

      def full?
        max_messages_reached? || max_size_reached?
      end

      def update_retry
        @retry_count += 1
        @retry_at = Time.now + (RETRY_MAP[@retry_count] || 120)
      end

      def can_run?
        return true if @retry_count.zero?

        Time.now >= @retry_at
      end

      def can_retry?
        @retry_count < MAX_RETRY
      end

      private

      def max_messages_reached?
        @messages.length >= MAX_MESSAGES
      end

      def max_size_reached?
        @total_bytes >= MAX_BYTES
      end

      def max_message_reached?(message_json_size)
        message_json_size > MAX_MESSAGE_BYTES
      end

    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
liveqa-1.9.3 lib/liveqa/processor/batch.rb
liveqa-1.9.2 lib/liveqa/processor/batch.rb
liveqa-1.9.1 lib/liveqa/processor/batch.rb
liveqa-1.9.0 lib/liveqa/processor/batch.rb