class PatronusFati::Connection

Attributes

port[R]
read_queue[RW]
read_thread[RW]
server[R]
socket[RW]
write_queue[RW]
write_thread[RW]

Public Class Methods

new(server, port) click to toggle source
# File lib/patronus_fati/connection.rb, line 5
def initialize(server, port)
  @server = server
  @port = port

  self.read_queue = Queue.new
  self.write_queue = Queue.new
end

Public Instance Methods

connect() click to toggle source
# File lib/patronus_fati/connection.rb, line 13
def connect
  establish_connection
  return unless connected?

  start_read_thread
  start_write_thread
end
connected?() click to toggle source
# File lib/patronus_fati/connection.rb, line 21
def connected?
  !(socket.nil? || socket.closed?)
end
disconnect() click to toggle source
# File lib/patronus_fati/connection.rb, line 25
def disconnect
  return unless socket

  Thread.kill(read_thread)
  Thread.kill(write_thread)

  socket.close unless socket.closed?

  self.socket = nil
end
read() click to toggle source
# File lib/patronus_fati/connection.rb, line 36
def read
  read_queue.pop
end
write(msg) click to toggle source
# File lib/patronus_fati/connection.rb, line 40
def write(msg)
  write_queue.push(msg)
end

Protected Instance Methods

establish_connection() click to toggle source
# File lib/patronus_fati/connection.rb, line 49
def establish_connection
  return if connected?
  @socket = TCPSocket.new(server, port)
end
start_read_thread() click to toggle source
# File lib/patronus_fati/connection.rb, line 54
def start_read_thread
  self.read_thread = Thread.new do
    begin
      while (line = socket.readline)
        read_queue << line
      end
    rescue IOError, EOFError => e
      raise DisconnectError
    rescue => e
      PatronusFati.logger.error(format('Error in read thread: %s %s', e.class.to_s, e.message))
      e.backtrace.each do |l|
        PatronusFati.logger.error(l)
      end
    ensure
      socket.close if socket && !socket.closed?
    end
  end
end
start_write_thread() click to toggle source
# File lib/patronus_fati/connection.rb, line 73
def start_write_thread
  self.write_thread = Thread.new do
    begin
      count = 0
      while (msg = write_queue.pop)
        socket.write("!%i %s\r\n" % [count, msg])
        count += 1
      end
    rescue => e
      PatronusFati.logger.error(format('Error in write thread: %s %s', e.class.to_s, e.message))
      e.backtrace.each do |l|
        PatronusFati.logger.error(l)
      end
    ensure
      socket.close if socket && !socket.closed?
    end
  end
end