Изменить область действия веб-сокета (от приложения к сеансу/представлению)

Я создал базовый веб-сокет с помощью учебника.

Вот конфигурация:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
         registry.addEndpoint("/chat");
         registry.addEndpoint("/chat").withSockJS();
    }
}

А вот и контроллер обработки сообщений:

@MessageMapping("/chat")
@SendTo("/topic/messages")
public OutputMessage send(Message message) throws Exception {
    return new OutputMessage("Hello World!");
}

Все работает, но, судя по моему исследованию, веб-сокеты по умолчанию имеют область применения (подключившись к каналу, я вижу все звонки от всех пользователей).

Что я хочу сделать, так это иметь возможность видеть только вызовы из текущего сеанса пользователя или только из текущего представления. Любые идеи о том, как применить эти конфигурации?


person degath    schedule 08.01.2021    source источник


Ответы (1)


Мне удалось решить эту загадку, поэтому я делюсь с вами своими находками.

Во-первых, я нашел информацию, что простой брокер сообщений в памяти не может справиться с этим:

    /*
     * This enables a simple (in-memory) message broker for our application.
     * The `/topic` designates that any destination prefixed with `/topic`
     * will be routed back to the client.
     * It's important to keep in mind, this will not work with more than one
     * application instance, and it does not support all of the features a
     * full message broker like RabbitMQ, ActiveMQ, etc... provide.
     */

Но это вводило в заблуждение, так как этого можно было легко добиться с помощью аннотации @SendToUser. Также важно то, что теперь на стороне клиента вам нужно добавить дополнительный префикс /user/ при подписке на канал, поэтому решение будет таким:

  1. На стороне сервера: измените @SendTo("/topic/messages") на @SendToUser("/topic/messages").
  2. На стороне клиента: /topic/messages в файл /user/topic/messages.
person degath    schedule 11.01.2021