Twisted Deferred kann nach Verbindungsfehler nicht aufgerufen werden
Frage
Meine Kundenfabrik hier haben:
import logging, traceback
from twisted.internet.protocol import ClientFactory
from twisted.internet import defer, reactor, ssl
from twisted.application import service
from protocols.smpp.protocol import SMPPClientProtocol
class SMPPClientFactory(ClientFactory):
protocol = SMPPClientProtocol
def __init__(self, config):
self.config = config
def getConfig(self):
return self.config
def clientConnectionFailed(self, connector, reason):
print "clientConnectionFailed"
self.connectDeferred.errback(reason)
def clientConnectionLost(self, connector, reason):
print "clientConnectionLost"
def connect(self):
self.connectDeferred = defer.Deferred()
factory = SMPPClientFactory(self.config, self.msgHandler)
self.log.warning('Establishing TCP connection to %s:%d' % (self.config.host, self.config.port))
reactor.connectTCP(self.config.host, self.config.port, factory)
return self.connectDeferred
Und hier wird Code gestartet:
import logging, traceback
from twisted.internet import reactor, defer
from protocols.smpp.configs import SMPPClientConfig
from protocols.smpp.smpp_operations import SMPPOperationFactory
from testbed.client import SMPPClientFactory
class SMPP(object):
def __init__(self, config=None):
if config is None:
config = SMPPClientConfig()
self.config = config
self.opFactory = SMPPOperationFactory(config)
def run(self):
try:
#Bind
SMPPClientFactory(self.config, self.handleMsg).connect().addErrback(self.connectFailed)
except Exception, e:
print "ERROR: %s" % str(e)
def connectFailed(self, reason):
print "Connection failed %s" % str(reason)
def handleMsg(self, smpp, pdu):
pass
if __name__ == '__main__':
config = SMPPClientConfig(host='127.0.0.1', port=2775, username='smppclient1', password='password',
log_level=logging.DEBUG)
logging.basicConfig(level=config.log_level, filename=config.log_file, format=config.log_format,datefmt=config.log_dateformat)
SMPP(config).run()
reactor.run()
Wenn die Verbindung fehlschlägt (der Remote-Server ist ausgefallen), wird der ClientConnectionFailed der Fabrik aufgerufen, aber seltsamerweise wird eine "Ausnahmen.AttributeError: SMPPClientFactory-Instanz hat kein Attribut 'connectDeferred'".
Ich muss den Errback aufrufen, wenn die Verbindung fehlschlägt. Es scheint, dass beim Umgang mit Verzögerungen etwas fehlt.
Lösung
In Ihrem Startcode haben Sie eine SMPPClientFactory instanziiert und darauf connect () aufgerufen.Diese bestimmte Instanz hat das Attribut connectDeferred.Connect instanziierte jedoch auch eine andere SMPPClientFactory: factory = SMPPClientFactory(self.config, self.msgHandler)
. Dies ist die Instanz, mit der Sie die eigentliche Verbindung erstellt haben.Dies hat nicht das Attribut connectDeferred, da bei dieser Instanz connect nie aufgerufen wurde.