I'm using Spring WS STOMP to handle server to client notifications.
I'm using an external broker: RabbitMQ.
As far as I read, Spring forwards /topic
messages to broker.
By other hand /app
messages are handle directly from Spring Controller and the reply is sent just to the requester.
My js client has to subscribe to a notification service that inform the user about the status of a service.
The message broker sends the STOMP message for each status change.
But at the client subscription I need to initilize the information with the current status and to reply just to this client without involving the broker.
Then I tought /topic/...
is the message for broadcasting the status change, and /app/...
is the message to initialize the client status at client subscription without involving the broker.
This is my controller to reply with service status at subscription:
@SubscribeMapping("/servicestatus")
public Status subscriptionStatus() {
return checkService.getStats();
}
This is the js code:
stompClient.subscribe("/app/servicestatus", function (msg) { alert("Status change: "+msg); });
This client subscription works only for the very first initialization, if the broker sends a status update, the client doesn't receive it.
Then I tried to switch it to topic:
stompClient.subscribe("/topic/servicestatus", function (msg) { alert("Status change: "+msg); });
Now it works for updates from broker, but it doesn't work at the client subscription because @SubscribeMapping("/servicestatus")
is not reached.
What I'm missing? May I subscription to both /topic/servicestatus
and /app/servicestatus
with the same function?
I read this question: Does Spring @SubscribeMapping really subscribe the client to some topic? But I didn't find a clear solution.