Как отправить сообщение Autobahn / Twisted WAMP из-за пределов протокола?
Я следую основным примерам wamp pubsub в код github:
в этом примере публикуются сообщения из класса:
class Component(ApplicationSession):
"""
An application component that publishes an event every second.
"""
def __init__(self, realm = "realm1"):
ApplicationSession.__init__(self)
self._realm = realm
def onConnect(self):
self.join(self._realm)
@inlineCallbacks
def onJoin(self, details):
counter = 0
while True:
self.publish('com.myapp.topic1', counter)
counter += 1
yield sleep(1)
Я хочу создать ссылку, чтобы я мог публиковать сообщения по этому соединению из другого места в коде, т. е. myobject.myconnection.publish('com.myapp.topic1', 'My message')
из этого похожего вопрос ответ, похоже, заключается в том, что при подключении мне нужно установить что-то вроде self.factory.myconnection = self
. Я пробовал несколько перестановок это без успеха.
часть установки фабрики ниже:
## create a WAMP application session factory
##
from autobahn.twisted.wamp import ApplicationSessionFactory
session_factory = ApplicationSessionFactory()
## .. and set the session class on the factory
##
session_factory.session = Component
## create a WAMP-over-WebSocket transport client factory
##
from autobahn.twisted.websocket import WampWebSocketClientFactory
transport_factory = WampWebSocketClientFactory(session_factory, args.wsurl, debug = args.debug)
transport_factory.setProtocolOptions(failByDrop = False)
## start a WebSocket client from an endpoint
##
client = clientFromString(reactor, args.websocket)
client.connect(transport_factory)
где будет прикреплена любая ссылка, которую я установил из класса? к client
? к transport_factory
? к session_factory
?
1 ответов
после присоединения сеанса приложения к области WAMP он устанавливает ссылку на себя на фабрике сеансов приложения:
class MyAppComponent(ApplicationSession):
... snip
def onJoin(self, details):
if not self.factory._myAppSession:
self.factory._myAppSession = self
затем вы можете получить доступ к этому сеансу из другого места вашего кода, например
@inlineCallbacks
def pub():
counter = 0
while True:
## here we can access the app session that was created ..
##
if session_factory._myAppSession:
session_factory._myAppSession.publish('com.myapp.topic123', counter)
print("published event", counter)
else:
print("no session")
counter += 1
yield sleep(1)
pub()