如何在与autobahn.twisted.component

时间:2018-02-26 15:39:48

标签: python websocket twisted autobahn

当尝试使用推荐的组件装饰器方法将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

在网络状况不稳定的环境中,设置应该非常宽容。此外,应在连接关闭时进行重新连接。 也许我的方法根本就是错误的方向,我将不胜感激任何建议。

0 个答案:

没有答案