class Jabber::Reliable::Connection

Public Class Methods

new(full_jid, config) click to toggle source
Calls superclass method Jabber::Client.new
# File lib/xmpp4r/reliable.rb, line 7
def initialize(full_jid, config)
  super(full_jid)
  @servers = config[:servers]
  @port = config[:port] || 5222
  @max_retry = config[:max_retry] || 30
  @retry_sleep = config[:retry_sleep] || 2
  if(@servers.nil? or @servers.empty?)
    @servers = [@jid.domain]
  end
end

Public Instance Methods

connect() click to toggle source
Calls superclass method Jabber::Client#connect
# File lib/xmpp4r/reliable.rb, line 18
def connect
  retry_count = 0
  server_to_use = nil
  server_pool = @servers.dup.sort{ rand <=> rand }
  begin
    server_to_use = server_pool.shift
    server_pool.push(server_to_use)

    Jabber::debuglog "timeout will be: #{@retry_sleep.to_f}"
    Timeout.timeout(@retry_sleep.to_f){
      Jabber::debuglog "trying to connect to #{server_to_use}"
      super(server_to_use, @port)
    }

    Jabber::debuglog self.jid.to_s + " connected to " + server_to_use.to_s
    Jabber::debuglog "out of possible servers " + @servers.inspect
  rescue Exception, Timeout::Error => e
    Jabber::warnlog "#{server_to_use} error: #{e.inspect}. Will attempt to reconnect in #{@retry_sleep}"
    sleep(@retry_sleep.to_f)
    if(retry_count >= @max_retry.to_i)
      Jabber::warnlog "reached max retry count on exception, failing"
      raise e
    end
    retry_count += 1
    retry
  end
end