Spring Boot WebSocket - как получать уведомления о клиентских подписках - PullRequest
0 голосов
/ 23 января 2019

У меня есть приложение с большим количеством групп, где мой сервер использует очередь сообщений (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/*? Веб-пользователи будут подписываться и отписываться при просмотре веб-страницы.

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Вы можете прослушать событие SessionSubscribeEvent так:

@Component
public class WebSocketEventListener {

  @EventListener
  public void handleSessionSubscribeEvent(SessionSubscribeEvent event) {
      GenericMessage message = (GenericMessage) event.getMessage();
      String simpDestination = (String) message.getHeaders().get("simpDestination");

      if (simpDestination.startsWith("/topic/group/1")) {
        // do stuff
      }
  }
}
0 голосов
/ 18 марта 2019

Вы можете использовать обработчик событий, управляемый аннотациями (код Котлина):

@EventListener
private fun onSubscribeEvent(event: SessionSubscribeEvent) {
    // do stuff...
}

Такие прослушиватели событий можно зарегистрировать в любом открытом методе управляемого компонента с помощью аннотации @EventListener.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...