Spring web socket消息传递 - 订阅和发送初始消息

rai*_*rey 5 spring stomp spring-messaging spring-websocket

使用用于 Web 套接字消息传递的 Stomp 代理中继,我可以订阅目的地/topic/mydest。这将创建一个代理订阅并接收系统中的某些内容为此代理目标触发的所有消息,当系统中发生某些事件时会发生这种情况。

我可以订阅一个 destination /app/mydest,并且@SubscribeMapping("mydest")会调用一个控制器方法,并且返回值仅作为消息在此套接字上发回。据我所知,这是此订阅将发送的唯一消息。

有没有办法将其组合在单个订阅中,即为某个/topic目的地创建一个代理订阅,触发一些直接将消息发送回订阅者的代码?

用例:当系统中发生错误时,将带有当前错误计数的消息发送到/topic/mydest。当新客户订阅时,我只想向他发送最后已知的错误计数。其他人此刻不感兴趣,因为计数没有改变。

我当前的解决方案是订阅两者/app/mydest/topic/mydest在客户端使用相同的消息处理程序。但它确实是一种逻辑订阅,并且它有点容易出错,因为客户端需要记住同时订阅两者。

我在这种情况下的问题:是否会有进一步的/app/订阅消息?有什么可以调用来触发的吗?我还能如何向订阅者发送主题的初始信息,而不向现有订阅者发送冗余消息?

根据要求,这是我的 Websocket 配置类。

@Configuration
@EnableWebSocketMessageBroker
public class WebsocketConfiguration extends AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableStompBrokerRelay("/queue/", "/topic/", "/exchange/");
        registry.setApplicationDestinationPrefixes("/app");
    }
}
Run Code Online (Sandbox Code Playgroud)

Tol*_*edo 1

您可以使用ApplicationListenerSessionSubscribeEvent。例子:

@Component
public class SubscribeListener implements ApplicationListener<SessionSubscribeEvent> {

    private final SimpMessagingTemplate messagingTemplate;

    @Autowired
    public SubscribeListener(SimpMessagingTemplate messagingTemplate) {
        this.messagingTemplate = messagingTemplate;
    }

    @Override
    public void onApplicationEvent(SessionSubscribeEvent event) {
        messagingTemplate.convertAndSendToUser(event.getUser().getName(), "/topic/mydest", "Last known error count");
    }
}
Run Code Online (Sandbox Code Playgroud)