首页 文章

Spring WebSockets ActiveMQ convertAndSendToUser

提问于
浏览
2

我有一个Spring Boot应用程序(Jhipster),它使用STOMP over WebSockets将信息从服务器传递给用户 .

我最近添加了一个ActiveMQ服务器来处理水平扩展应用程序,使用亚马逊自动扩展组/负载均衡器 .

我使用 convertAndSendToUser() 方法,该方法适用于应用程序的单个实例,以找到经过身份验证的用户'"individual queue",以便只有他们收到消息 .

但是,当我在负载均衡器后面启动应用程序时,我发现只有在服务器上生成了他们的websocket-proxy连接(到代理) Build 的事件时,才会将消息发送给用户?

我如何确保消息通过ActiveMQ传递给用户实际"connected too"的任何应用实例,无论哪个实例接收,比如执行 convertAndSendToUser() 事件的HTTP请求?

这里是我的StompBrokerRelayMessageHandler:

@Bean
public AbstractBrokerMessageHandler stompBrokerRelayMessageHandler() {
    StompBrokerRelayMessageHandler handler = (StompBrokerRelayMessageHandler) super.stompBrokerRelayMessageHandler();
    handler.setTcpClient(new Reactor2TcpClient<>(
        new StompTcpFactory(orgProperties.getAws().getAmazonMq().getStompRelayHost(),
            orgProperties.getAws().getAmazonMq().getStompRelayPort(), orgProperties.getAws().getAmazonMq
            ().getSsl())
    ));

    return handler;
}

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableStompBrokerRelay("/queue", "/topic")
        .setSystemLogin(orgProperties.getAws().getAmazonMq().getStompRelayHostUser())
        .setSystemPasscode(orgProperties.getAws().getAmazonMq().getStompRelayHostPass())
        .setClientLogin(orgProperties.getAws().getAmazonMq().getStompRelayHostUser())
        .setClientPasscode(orgProperties.getAws().getAmazonMq().getStompRelayHostPass());

    config.setApplicationDestinationPrefixes("/app");
}

我找到了与ActiveMQ上生成的队列对应的名称,方法是检查 SessionSubscribeEvent 中的标头,该标头是在用户订阅用户队列时在监听器中生成的,如 simpSessionId .

@Override
@EventListener({SessionSubscribeEvent.class})
public void onSessionSubscribeEvent(SessionSubscribeEvent event) {
    log.debug("Session Subscribe Event:" +
        "{}", event.getMessage().getHeaders().toString());
}

相应的队列'可以在ActiveMQ中找到,格式为: {simpDestination}-user{simpSessionId}

我可以将sessionId保存在键值对中,只是将消息推送到该主题 Channels 吗?


我还在CONNECT / SUBSCRIBE框架中找到了一些设置ActiveMQ特定STOMP属性的possibilities来创建持久订阅者如果我设置这些属性会比Spring更了解路由吗?

client-idsubcriptionName

1 回答

相关问题