在AutobahnWS中使用Decorator方法,如何发布独立于订阅回调的消息及其Session-Reference?

时间:2018-01-09 06:21:53

标签: autobahn crossbar wamp-protocol autobahnws

在使用Subclassing-Approach之前使用Autobahn和WAMP但是偶然发现了装饰器/函数方法,我更喜欢子类化。

然而。我有一个从外部硬件调用的函数(通过回调),这个函数需要在调用时发布到Crossbar.io Router。

我就是这样做的,在Session被调用后立即引用on_join -> async def joined(session, details)

from autobahn.asyncio.component import Component
from autobahn.asyncio.component import run

global_session = None

comp = Component(
    transports=u"ws://localhost:8080/ws",
    realm=u"realm1",
)

def callback_from_hardware(msg):
    if global_session is None:
        return
    global_session.publish(u'com.someapp.somechannel', msg)

@comp.on_join
async def joined(session, details):
    global global_session
    global_session = session
    print("session ready")

if __name__ == "__main__":
    run([comp])

这种在组件加入连接后保持引用的方法感觉有点“奇怪”。这有不同的方法吗?这可以通过其他方式完成。

如果不是因为对子类化感觉更加“正确”并且所有应用程序都依赖于该子类中的代码(但是将我的应用程序的所有内容保留在一个子类中也感觉很奇怪)。

2 个答案:

答案 0 :(得分:0)

我建议使用异步队列而不是共享会话:

import asyncio

from autobahn.asyncio.component import Component
from autobahn.asyncio.component import run

queue = asyncio.queues.Queue()

comp = Component(
    transports=u"ws://localhost:8080/ws",
    realm=u"realm1",
)


def callback_from_hardware(msg):
    queue.put_nowait((u'com.someapp.somechannel', msg,))


@comp.on_join
async def joined(session, details):
    print("session ready")

    while True:
        topic, message, = await queue.get()
        print("Publishing: topic: `%s`, message: `%s`" % (topic, message))
        session.publish(topic, message)


if __name__ == "__main__":
    callback_from_hardware("dassdasdasd")
    run([comp])

答案 1 :(得分:0)

你可以采取多种方法,尽管最简单的IMO是使用Crossbar的http桥。因此,无论何时从您的硬件收到事件回调,您都可以向Crossbar发出http POST请求,并且您的消息将被传递

有关http bridge https://crossbar.io/docs/HTTP-Bridge-Publisher/

的更多详细信息