如何订阅一个内部的Spring Boot/Simple Broker主题队列?

3

我需要订阅内部的Spring Boot主题/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发布消息的内部队列/主题?
1个回答

1
您可以使用@sendTo注释和@DestinationVariable来区分您想要订阅的用户。我使用这种方法来分享我的当前订阅点数。 我将给出我的设置代码之一和一个简单的示例。
它继承自AbstractWebSocketMessageBrokerConfigurer,其配置是final的。
@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;
}

你想要的答案是什么?


此时,我稍微改变了我的策略,以利用这些功能。我记不太清楚了,但你的回答肯定会帮助需要它的人。 - Lucas Pires

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接