Sha256: 9ac5bb62b9c7d79664d92147cc7b03002b06b2635f9247a722d42f2f6c060f49

Contents?: true

Size: 1.74 KB

Versions: 4

Compression:

Stored size: 1.74 KB

Contents

require "#{File.dirname(__FILE__)}/logger"
require 'socket'
require 'timeout'

module Puggernaut
  class Client
    
    include Logger
    
    attr_accessor :connections
    
    def initialize(*servers)
      @connections = {}
      @retry = []
      @servers = servers.collect { |s| s.split(':') }
    end
    
    def close
      @connections.each do |host_port, connection|
        connection.close
        logger.info "Client#close - #{host_port}"
      end
    end
    
    def push(messages)
      messages = messages.collect do |channel, message|
        if message.is_a?(::Array)
          message.collect { |m| "#{channel}|#{m}" }.join("\n")
        else
          "#{channel}|#{message}"
        end
      end
      unless messages.empty?
        @servers.each do |(host, port)|
          send host, port, messages.join("\n")
        end
      end
    end
    
    private
    
    def send(host, port, data, try_retry=true)
      try if try_retry
      begin
        host_port = "#{host}:#{port}"
        logger.info "Client#send - #{host_port} - #{data}"
        response = nil
        Timeout.timeout(10) do
          connection = @connections[host_port] ||= TCPSocket.open(host, port)
          connection.print(data)
          response = connection.gets
        end
        raise 'not ok' if !response || !response.include?('OK')
      rescue Exception => e
        logger.info "Client#send - Exception - #{e.message} - #{host_port} - #{data}"
        @retry << [ host, port, data ]
        @retry.shift if @retry.length > 10
      end
      try if try_retry
    end
    
    def try
      @retry.length.times do
        host, port, data = @retry.shift
        @connections.delete("#{host}:#{port}")
        send host, port, data, false
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
puggernaut-0.2.3 lib/puggernaut/client.rb
puggernaut-0.2.2 lib/puggernaut/client.rb
puggernaut-0.2.1 lib/puggernaut/client.rb
puggernaut-0.2.0 lib/puggernaut/client.rb