Доброго времени суток! Проблема заключается в том, что у меня не получается обработать ситуацию потери соединения.
Объясню на конкретном примере. Подключаю аккаунт к джаббер серверу и начинаю его пинговать (wokkel.ping), на посылку пинга добавляю errback в котором ловится ConnectionLost. Далее отрубаю интернет, пинги продолжают идти и ConnectionLost не ловится. Принудительно закрываю соединение и далее обрабатываются все ранее необработанные исключения. Примерно вот так:
Пингуется нормально. [XmlStream,client] Ping to JID(u'jabber.ru') started at HivemindPingClientProtocol
[-] SEND: «iq to='jabber.ru' type='get' id='H_3'>/>»
[XmlStream,client] RECV: "/><feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>"
ConnectionLost не ловится, принудительно закрываю соединение. Stream closed at HivemindXMPPClient печатается в классе StreamManager в методе _disconnected [-] Protocol stopped
[-] Protocol closed
[-] Transport stopped
[XmlStream,client] Stream closed at HivemindXMPPClient
Все исключения обрабатываются после закрытия соединения. [XmlStream,client] Failure [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionLost'>: Connection to the other side was lost in a non-clean fashion.
[XmlStream,client] Failure [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionLost'>: Connection to the other side was lost in a non-clean fashion.]
[XmlStream,client] Connection lost with [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionDone'>: Connection was closed cleanly.]
[XmlStream,client] Stopping factory <hivemind.network.network_core.HivemindXmlStreamFactory object at 0xa2e904c>>
Кто нибудь сталкивался с такой ситуацией? Что я делаю не так? На самом деле я пытаюсь обработать это исключение, чтобы сделать реконнект (разрыв соединения + фабрика начинает реконнект). Помогите, пожалуйста, с реконнектом.
Накидал небольшой примерчик. Использовать следующим образом: Сначала запустить, потом отрубить интернет, после парочки пингов завершить и скрипт и можно увидеть, что исключения ConnectionLost ловятся, но уже после завершения соединения…
# -*- coding: utf-8 -*-
import sys
from twisted.python import log
from twisted.words.protocols import jabber
from twisted.internet.error import ConnectionLost
from wokkel.client import XMPPClient
from wokkel.ping import PingClientProtocol
from twisted.internet.task import LoopingCall
def _onError(self, failure):
log.msg('Failure %s at %s' % (failure, self.__class__.__name__))
error = failure.trap(jabber.error.StanzaError, ConnectionLost)
if error == jabber.error.StanzaError:
if failure.value.condition == 'feature-not-implemented':
return None
elif error == ConnectionLost:
# Do some beautiful things
log.msg('Connection is lost. I want to reconnect NOW')
return failure
def stopPing(self):
log.msg('Ping to %s stopped at %s' % (self.__entity, self.__class__.__name__))
if self.__pingLoop is not None and self.__pingLoop.running:
self.__pingLoop.stop()
self.__pingLoop = None
def startPing(self):
log.msg('Ping to %s started at %s ' % (self.__entity, self.__class__.__name__))
self.__pingLoop = LoopingCall(self._sendPing)
self.__pingLoop.start(self.__interval, now = False)