Ritorto differito non richiamabile dopo un errore di connessione
Domanda
Avere la mia fabbrica cliente qui:
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
E sta lanciando il codice qui:
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()
Quando la connessione non riesce (il server remoto è inattivo), ottengo chiamata clientConnectionFailed di fabbrica ma stranamente riceve un "exceptions.AttributeError: l'istanza SMPPClientFactory non ha l'attributo" connectDeferred "".
Devo richiamare l'errback quando la connessione non riesce, sembra che manchi qualcosa quando si tratta di differiti ..
Soluzione
Nel codice di lancio, hai istanziato un SMPPClientFactory e hai chiamato connect () su di esso.Questa particolare istanza avrà l'attributo connectDeferred.Tuttavia, connect ha anche istanziato un altro SMPPClientFactory: factory = SMPPClientFactory(self.config, self.msgHandler)
e questa è l'istanza utilizzata per creare la connessione effettiva.Questo non ha l'attributo connectDeferred perché con questa istanza la connessione non è mai stata chiamata.