Как обнаружить потерянное клиентское соединение на сервере, который наследуется от pb.Root? - PullRequest
4 голосов
/ 02 февраля 2010

Например, у меня есть клиент, который подключается к серверу со следующими данными:

class MyClientFactory(pb.PBClientFactory, ReconnectingClientFactory):
    def __init__(self):
        pb.PBClientFactory.__init__(self)
        self.ipaddress = None

    def clientConnectionMade(self, broker):
        log.msg('Started to connect.')
        pb.PBClientFactory.clientConnectionMade(self, broker)

    def buildProtocol(self, addr):
        log.msg('Connected to %s' % addr)
        return pb.PBClientFactory.buildProtocol(self, addr)

    def clientConnectionLost(self, connector, reason):
        log.msg('Lost connection.  Reason:', reason)
        ReconnectingClientFactory.clientConnectionLost(self, connector, reason)

    def clientConnectionFailed(self, connector, reason):
        log.msg('Connection failed. Reason:', reason)
        ReconnectingClientFactory.clientConnectionLost(self, connector, reason)

Таким образом, клиент может автоматически определять, когда теряется соединение.

Как мне получить такое же поведение от сервера, если клиент выходит из строя, например, сбой?

В настоящее время я ловлю DeadReferenceError (путем перебора списка потенциально подключенных клиентов), но это не управляемый событиями способ - и, честно говоря, слишком поздно.

Любые идеи приветствуются.

Заранее спасибо.

Ben

1 Ответ

4 голосов
/ 02 февраля 2010

Вы можете зарегистрировать обратный вызов, который будет вызываться при потере соединения. Для этого есть два API, один Broker.notifyOnDisconnect, другой RemoteReference.notifyOnDisconnect. Они делают то же самое, но доступ к одному или другому может быть более удобным в зависимости от деталей вашего приложения.

Я не уверен, что вы можете использовать это для гарантии того, что вы никогда не получите DeadReferenceError (например, я не уверен, что произойдет, если метод remote_foo, если у вас есть При вызове вы возвращаете Отложенный, соединение теряется, а затем Откладывается срабатывание), но вы можете по крайней мере радикально уменьшить вероятность в общем случае (т. е. вы должны всегда иметь возможность избежать получения DeadReferenceError из callRemote если вы никогда не используете callRemote после того, как notifyOnDisconnect перезвонит вашей функции).

...