У меня есть приложение с большим количеством групп, где мой сервер использует очередь сообщений (RabbitMQ) для наблюдения за группами и отправки уведомления пользователю об изменениях через WebSocket. Я использую Spring boot и их реализацию WebSocket, вдохновленную этим руководством: https://spring.io/guides/gs/messaging-stomp-websocket/
Вот пример JavaScript-клиента, подписывающегося на канал:
var socket = new SockJS('http://localhost/ws');
stompClient = Stomp.over(socket);
stompClient.connect({}, function (frame) {
console.log('Connected: ' + frame);
stompClient.subscribe('/topic/group/1/notification', function (message) {
// to something..
});
});
В контроллере Java Spring WebSocket используется этот broadcastNotification
метод отправки сообщений на канал /topic/group/{groupId}/notification
.
@Controller
public class GroupController {
private SimpMessagingTemplate template;
@Autowired
public GroupController(SimpMessagingTemplate template) {
this.template = template;
}
public void broadcastNotification(int groupId, Notification notification) {
this.template.convertAndSend("/topic/group/." + tenantId + "/notification", Notification);
}
}
Это нормально работает, но с учетом производительности я хотел бы, чтобы моя бизнес-логика наблюдала только за группами, в настоящее время подписанными на WebSocket.
Как я могу получать уведомления на моем сервере, когда клиенты подписываются на канал /topic/group/1/notification
или /topic/group/1/*
? Веб-пользователи будут подписываться и отписываться при просмотре веб-страницы.