mirror of
https://github.com/correl/SleekXMPP.git
synced 2024-12-18 03:00:18 +00:00
Add exponential backoff to connection attempts.
Delay will approximately double between attempts (random variation). See issue #67.
This commit is contained in:
parent
384e1a92b7
commit
b81ab97900
1 changed files with 15 additions and 1 deletions
|
@ -17,6 +17,7 @@ import sys
|
||||||
import threading
|
import threading
|
||||||
import time
|
import time
|
||||||
import types
|
import types
|
||||||
|
import random
|
||||||
try:
|
try:
|
||||||
import queue
|
import queue
|
||||||
except ImportError:
|
except ImportError:
|
||||||
|
@ -45,6 +46,9 @@ HANDLER_THREADS = 1
|
||||||
# Flag indicating if the SSL library is available for use.
|
# Flag indicating if the SSL library is available for use.
|
||||||
SSL_SUPPORT = True
|
SSL_SUPPORT = True
|
||||||
|
|
||||||
|
# Maximum time to delay between connection attempts is one hour.
|
||||||
|
RECONNECT_MAX_DELAY = 3600
|
||||||
|
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -104,7 +108,11 @@ class XMLStream(object):
|
||||||
use_ssl -- Flag indicating if SSL should be used.
|
use_ssl -- Flag indicating if SSL should be used.
|
||||||
use_tls -- Flag indicating if TLS should be used.
|
use_tls -- Flag indicating if TLS should be used.
|
||||||
stop -- threading Event used to stop all threads.
|
stop -- threading Event used to stop all threads.
|
||||||
auto_reconnect-- Flag to determine whether we auto reconnect.
|
|
||||||
|
auto_reconnect -- Flag to determine whether we auto reconnect.
|
||||||
|
reconnect_max_delay -- Maximum time to delay between connection
|
||||||
|
attempts. Defaults to RECONNECT_MAX_DELAY,
|
||||||
|
which is one hour.
|
||||||
|
|
||||||
Methods:
|
Methods:
|
||||||
add_event_handler -- Add a handler for a custom event.
|
add_event_handler -- Add a handler for a custom event.
|
||||||
|
@ -155,6 +163,7 @@ class XMLStream(object):
|
||||||
self.ca_certs = None
|
self.ca_certs = None
|
||||||
|
|
||||||
self.response_timeout = RESPONSE_TIMEOUT
|
self.response_timeout = RESPONSE_TIMEOUT
|
||||||
|
self.reconnect_max_delay = RECONNECT_MAX_DELAY
|
||||||
|
|
||||||
self.state = StateMachine(('disconnected', 'connected'))
|
self.state = StateMachine(('disconnected', 'connected'))
|
||||||
self.state._set_state('disconnected')
|
self.state._set_state('disconnected')
|
||||||
|
@ -291,9 +300,14 @@ class XMLStream(object):
|
||||||
# is established.
|
# is established.
|
||||||
connected = self.state.transition('disconnected', 'connected',
|
connected = self.state.transition('disconnected', 'connected',
|
||||||
func=self._connect)
|
func=self._connect)
|
||||||
|
delay = 1.0
|
||||||
while reattempt and not connected:
|
while reattempt and not connected:
|
||||||
connected = self.state.transition('disconnected', 'connected',
|
connected = self.state.transition('disconnected', 'connected',
|
||||||
func=self._connect)
|
func=self._connect)
|
||||||
|
delay = min(delay * 2, self.reconnect_max_delay)
|
||||||
|
delay = random.normalvariate(delay, delay * 0.1)
|
||||||
|
log.debug('Waiting %s seconds before reconnecting.' % delay)
|
||||||
|
time.sleep(delay)
|
||||||
return connected
|
return connected
|
||||||
|
|
||||||
def _connect(self):
|
def _connect(self):
|
||||||
|
|
Loading…
Reference in a new issue