当尝试使用推荐的组件装饰器方法将python应用程序连接到Crossbar路由器时,我将auto_reconnect=True
值传递给传输的方式和位置。我可以在Component.transports
中设置参数,但仅此一项不会“激活”自动重新连接。
使用ApplicationRunner
的继承方法时,您可以在调用run(app, auto_reconnect=True)
时设置该方法。
文档只提到如何设置“策略”: http://autobahn.readthedocs.io/en/latest/reference/autobahn.twisted.html#autobahn.twisted.component.Component
此外,将max_retries
设置为-1时,它根本不连接(“没有剩余的传输尝试”),而不是无限尝试重新连接。
以下是我的测试方法:
from autobahn.twisted.component import Component, run
from autobahn.twisted.util import sleep
from autobahn.wamp.types import RegisterOptions
from twisted.internet.defer import inlineCallbacks, returnValue
class App:
component = Component(
transports=[
{
'type': 'websocket',
'url': 'ws://<router-IP>:8080/ws',
'max_retries': 10,
# 'max_retries': -1,
'initial_retry_delay': 3,
'max_retry_delay': 120,
'retry_delay_growth': 1,
'retry_delay_jitter': 0.1,
'options': {
'open_handshake_timeout': 0,
'close_handshake_timeout': 0,
'auto_ping_interval': 0,
'auto_ping_timeout': 0,
'auto_reconnect': True
}
}
],
realm='test_realm'
)
def __init__(self):
pass
@classmethod
def start(cls):
# do startup stuff, then
run([cls.component])
@staticmethod
@component.on_join
@inlineCallbacks
def join(session, details):
print("joined {}: {}".format(session, details))
yield sleep(1)
print("Calling 'com.example'")
res = yield session.call(u"example.foo", 42, something="nothing")
print("Result: {}".format(res))
yield session.leave()
@component.register(
u"example.foo",
options=RegisterOptions(details_arg='details'),
)
@inlineCallbacks
def foo(*args, **kw):
print("foo called: {}, {}".format(args, kw))
for x in range(10, 0, -1):
print(" returning in {}".format(x))
yield sleep(5)
print("returning '42'")
returnValue(42)
if __name__ == "__main__":
app = App()
app.start()
编辑: 我使用Component的原因是,您无法使用ApplicationRunner设置websocket选项。 https://github.com/crossbario/autobahn-python/issues/838
在网络状况不稳定的环境中,设置应该非常宽容。此外,应在连接关闭时进行重新连接。 也许我的方法根本就是错误的方向,我将不胜感激任何建议。