Как подписаться на внутреннюю очередь тем Spring Boot/Simple Broker?

Мне нужно подписаться на внутреннюю тему весенней загрузки /user/exchange/amq.direct/chat.message, чтобы создать бота, который подпишется на очередь тем и ответит на сообщения.

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration extends AbstractWebSocketMessageBrokerConfigurer {

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {

    registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();

}

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
    // use the /topic prefix for outgoing WebSocket communication
    config.enableSimpleBroker("/queue/", "/topic/", "/exchange/");

    // use the /app prefix for others
    config.setApplicationDestinationPrefixes("/app");
}

}

Мой контроллер:

    @MessageMapping("/chat.message")
public ChatMessage filterMessage(@Payload ChatMessage message, Principal principal) {

    message.setUsername(principal.getName());

    return message;
}

@MessageMapping("/chat.private.{username}")
public void filterPrivateMessage(@Payload ChatMessage message, @DestinationVariable("username") String username, Principal principal) {

    message.setUsername(principal.getName());

    simpMessagingTemplate.convertAndSend("/user/" + username + "/exchange/amq.direct/chat.message", message);

}

Как подписаться на внутреннюю очередь/тему, в которую я помещаю сообщение по SimpMessagingTemplate?


person Lucas Pires    schedule 25.07.2016    source источник


Ответы (1)


Вы можете использовать аннотацию @sendTo и @DestinationVariable, чтобы различать, на какого пользователя вы хотите подписаться. Я использую этот метод, чтобы поделиться своими текущими баллами подписки. Я дам вам один из моих кодов установки и простой пример.

Он наследуется от AbstractWebSocketMessageBrokerConfigurer, и его конфигурация является окончательной.

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

Этот код может отправить сообщение только тому пользователю, который подписался на определенный путь и путь, на который клиент отправляет сообщение.

@MessageMapping(value = "/question/detail/{questionId}/message")
@SendTo("/question/detail/{questionId}")
public MessageDto message(@DestinationVariable Long questionId, MessageDto messageDto) {
    return messageDto;
}

Это ответ, который вы хотите?

person 원일준    schedule 21.07.2018
comment
В это время я немного изменил свою стратегию, чтобы использовать эти функции, я не очень хорошо помню, но ваш ответ наверняка поможет людям, которые в нем нуждаются. - person Lucas Pires; 14.08.2018