2016-11-21 5 views
0

Согласно documentation, учитывая, что я инстанцирован соединение:питон - восстановить педаль эффектов соединения, когда мертвые

>>> import stomp 
>>> c = stomp.Connection([('127.0.0.1', 62615)]) 
>>> c.start() 
>>> c.connect('admin', 'password', wait=True) 

Как контролировать его так, чтобы он воссоединяется на c.is_connected == False?

>>> reconnect_on_dead_connection(c) 
... 
>>> [1479749503] reconnected dead connection 

ответ

1

Вы можете обернуть свое соединение и проверить, подключен ли к нему каждый звонок.

import stomp 


def reconnect(connection): 
    """reconnect here""" 


class ReconnectWrapper(object): 
    def __init__(self, connection): 
     self.__connection = connection 

    def __getattr__(self, item): 
     if not self.__connection.is_connected: 
      reconnect(self.__connection) 
     return getattr(self.__connection, item) 


if __name__ == '__main__': 
    c = stomp.Connection([('127.0.0.1', 62615)]) 
    c.start() 
    c.connect('admin', 'password', wait=True) 
    magic_connection = ReconnectWrapper(c) 

Тест:

from scratch_35 import ReconnectWrapper 
import unittest 
import mock 


class TestReconnection(unittest.TestCase): 

    def setUp(self): 
     self.connection = mock.MagicMock() 
     self.reconnect_patcher = mock.patch("scratch_35.reconnect") 
     self.reconnect = self.reconnect_patcher.start() 

    def tearDown(self): 
     self.reconnect_patcher.stop() 

    def test_pass_call_to_warapped_connection(self): 
     connection = ReconnectWrapper(self.connection) 
     connection.send("abc") 
     self.reconnect.assert_not_called() 
     self.connection.send.assert_called_once_with("abc") 

    def test_reconnect_when_disconnected(self): 
     self.connection.is_connected = False 
     connection = ReconnectWrapper(self.connection) 
     connection.send("abc") 
     self.reconnect.assert_called_once_with(self.connection) 
     self.connection.send.assert_called_once_with("abc") 


if __name__ == '__main__': 
    unittest.main() 

результат:

.. 
---------------------------------------------------------------------- 
Ran 2 tests in 0.004s 

OK 

Ключ волшебный метод __getatter__ это называется каждый раз, когда вы пытаетесь получить доступ к атрибуту, не обеспечиваемый объектом. Подробнее о методе __getattr__ вы можете найти в приложении https://docs.python.org/2/reference/datamodel.html#object.getattr.