I have Python client which opens a websocket connection to a server and subscribes to particular topic using STOMP protocol, subscription goes just fine as i see on the server all is fine. However, When the server publishes a few messages the client does not receive any. Here are the codes used:
Client
# coding: utf-8 import websocket import stomp import stomper token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsInByaW5jaXBhbF9uYW1lIjoiYWRtaW4iLCJpc3MiOiJBdGhlbmEiLCJ1c2VydHlwZSI6IkxPQ0FMIiwiYW9zX3ZlcnNpb24iOiJldXBocmF0ZXMtNS4xMS1zdGFibGUiLCJyZWdpb24iOiJlbi1VUyIsImV4cCI6MTczNDI4MDI3NywidXVpZCI6ImI4MzhjOGRkLWI4NmQtNGNkZS05ZTE4LTUxM2E1OTk4ODhhYyIsImlhdCI6MTU3NjYwMDI3NywiYXV0aG9yaXRpZXMiOiJST0xFX0NMVVNURVJfQURNSU4sUk9MRV9NVUxUSUNMVVNURVJfQURNSU4sUk9MRV9VU0VSX0FETUlOLFJPTEVfQ0xVU1RFUl9WSUVXRVIiLCJqdGkiOiI1NTU1ZjEwZC04NGQ5LTRkZGYtOThhNC1mZmI1OTM1ZTQwZWEifQ.LOMX6ppkcSBBS_UwW9Qo2ieWZAGrKqADQL6ZQuTi2oieYa_LzykNiGMWMYXY-uw40bixDcE-aVWyrIEZQbVsvA" headers = {"Authorization": "Bearer " + token} uri = "ws://127.0.0.1:8765/notifications/websocket" def on_msg(ws, msg): print(msg) def on_error(ws, err): print(err) def on_closed(ws): print("#Closed#") def on_open(ws): sub = stomper.subscribe("/user/queue/alert", "MyuniqueId", ack="auto") ws.send(sub) headers = {"Authorization": "Bearer " + token} websocket.enableTrace(True) ws = websocket.WebSocketApp(uri, header=headers, on_message=on_msg, on_error=on_error, on_close=on_closed) ws.on_open = on_open ws.run_forever()
Code server uses to publish the message:
for (WatchesSubscription s : subscriptions) { template.convertAndSendToUser(s.getSession().getUser(), destination, dto); }
When i checked out the value of the above variables i saw that destination was as expected queue/alerts. I have java client to test out as well and it works just fine. I have even tried this by subscribing to /topic/alerts
and sending to it via template.convertAndSend(/topic/alerts)
, here too i received nothing. I am a drawing a complete blank on this and would appreciate any sort of help!
Advertisement
Answer
After many days of hair pulling I finally figured out the reason and the fix!
- The java client I used was
WebSocketStompClient stompClient = new WebSocketStompClient(transport);
.ThestompClient.connect(URL, webSocketHttpHeaders, sessionHandler);
method implicitly sends a stompCONNECTnnx00n
- The Springboot server which has been configured for STOMP understands this as a connection request and responds with a
CONNECT_ACK
. - When this ACK is sent it also updates it’s local
UserRegistry
with the new user. So the internal message broker knows that there is a user who has subscribed to so-and-so topic. - In my Python code, i had merely opened a Websocket connection and after that directly sent a
SUBSCRIBE
message. So the broker never got aCONNECT
so the user was never stored! This resulted in the messages later on being published to be merely discarded by the broker. - The fix was to send a
CONNECTnnx00n
after opening up the connection and before the subscription. Here is the code:
def on_open(ws): #The magic happens here! ws.send("CONNECTnaccept-version:1.0,1.1,2.0nnx00n") sub = stomper.subscribe("/user/queue/alert", "MyuniqueId", ack="auto") ws.send(sub)