python - 死机时重新连接 stomp 连接
python - reconnect stomp connection when dead
根据 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
您可以包装您的连接并检查它是否连接到每个呼叫。
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 中找到。
如果您使用 Stomp 作为发件人:
def reconnect_on_dead_connection(c):
if c.is_connected():
c.connect('admin', 'password', wait=True)
并在发送 Stomp 消息之前调用它。
如果您使用的是 ConnectionListener class 扩展,请使用 on_disconnected
回调重新连接。
根据 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
您可以包装您的连接并检查它是否连接到每个呼叫。
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 中找到。
如果您使用 Stomp 作为发件人:
def reconnect_on_dead_connection(c):
if c.is_connected():
c.connect('admin', 'password', wait=True)
并在发送 Stomp 消息之前调用它。
如果您使用的是 ConnectionListener class 扩展,请使用 on_disconnected
回调重新连接。