Spring WebSocket with Stomp全功能代理和故障转移

5vf7fwbs  于 2023-05-05  发布在  Spring
关注(0)|答案(1)|浏览(152)

我有spring的配置和一个全功能的stomp broker(ActiveMQ):

@Configuration
@EnableWebSocketMessageBroker
public class WebsocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    private static Logger LOG = org.slf4j.LoggerFactory.getLogger(WebsocketConfig.class);

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableStompBrokerRelay("/topic/", "/queue/");
        config.setApplicationDestinationPrefixes("/app");
        config.setUserDestinationPrefix("/user");
    }

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

简单地说,我认为spring使用了我当前的ActiveMQ配置,但实际上它试图使用默认的stomp端口连接到位于localhost中的服务器。我发现可以通过键入以下命令更改此配置:

config.enableStompBrokerRelay("/topic/", "/queue/")
            .setRelayHost("activeMQHOST")
            .setRelayPort(9999);

这很好,但目前我有一个带有两个代理(master/flave with shared file system)的故障转移设置。如何为stomp broker中继配置此类设置?
如果不可能的话,我想在以下的解决方案:
1.使用简单的(在内存中)代理,这是不可取的

  1. ActiveMQ用于几个操作(不限于websockets),我不知道是否建议将stomp/websockets队列与其他功能的队列混合使用。考虑一下,我可以创建 * 另一个 * ActiveMQ示例(可能使用VM transport
    第二个选择是明智的吗?
wa7juj8i

wa7juj8i1#

下面是使用两个代理的故障转移设置的示例配置:

@Configuration
@EnableWebSocketMessageBroker
public class WebsocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    private static Logger LOG = org.slf4j.LoggerFactory.getLogger(WebsocketConfig.class);

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        StompBrokerRelayRegistration relayRegistration = config.enableStompBrokerRelay("/topic/", "/queue/");
        relayRegistration.setRelayHost("tcp://activeMQHOST1:61616,tcp://activeMQHOST2:61616");
        relayRegistration.setClientLogin("USERNAME");
        relayRegistration.setClientPasscode("PASSWORD");
        relayRegistration.setSystemLogin("USERNAME");
        relayRegistration.setSystemPasscode("PASSWORD");
        config.setApplicationDestinationPrefixes("/app");
        config.setUserDestinationPrefix("/user");
    }

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

在这里,您可以使用setRelayHost方法获取两个代理地址的逗号分隔列表,setClientLogin、setClientPasscode、setSystemLogin和setSystemPasscode方法指定客户端和系统的登录凭据。

相关问题