Spring Websocket 是一个功能齐全的代理服务器,支持 Stomp 协议,并具备故障转移功能。

18

我有这些 Spring 和完整功能的 Stomp 代理(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端口的服务器。我发现可以通过输入以下内容来更改此配置:

Naively, I though spring used my current ActiveMQ configuration but in reality it tries to connect into a server located in localhost with a default stomp port. I discovered that is possible to change this configuration by typing:

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

好的,但是目前我有一个故障转移设置,其中有两个代理 (共享文件系统的主/备)。如何为stomp代理中继配置这样的设置?

如果不可能,我考虑以下解决方案:

  1. 使用简单的(内存)代理,这并不推荐
  2. ActiveMQ用于多个操作(不限于WebSockets),我不知道将stomp/WebSockets队列与其他功能队列混合使用是否推荐。考虑到这一点,我可以创建另一个 ActiveMQ 实例 (也许使用VM传输方式).

第二个选项可行吗?


这里的回答解决了你的问题吗?这是被标记为“activemq”的最高投票问题,但没有一个“正确”的答案。如果当前的回答确实是正确的,将其标记为正确会对其他遇到同样问题的用户有所帮助。如果不正确,解释一下原因会很有帮助。谢谢! - undefined
2个回答

0

您可以通过使用RelayConnectionFactory并将故障转移传输选项设置为故障转移代理列表,在Spring中为Stomp代理中继配置故障转移设置。

以下是一个使用带有故障转移传输的RelayConnectionFactory的示例配置:

@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/")
                .setClientLogin("username")
                .setClientPasscode("password")
                .setSystemLogin("username")
                .setSystemPasscode("password")
                .setTcpKeepAlive(true)
                .setTcpNoDelay(true)
                .setVirtualHost("virtualHost")
                .setRelayHosts(Arrays.asList(
                        "tcp://activeMQHOST1:61613",
                        "tcp://activeMQHOST2:61613"))
                .setRelayPort(61613)
                .setRelayConnectTimeout(5000);
        config.setApplicationDestinationPrefixes("/app");
        config.setUserDestinationPrefix("/user");
    }

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

此配置使用RelayConnectionFactory设置enableStompBrokerRelay,并使用setRelayHosts方法指定故障转移代理列表。您可以使用setRelayPort方法设置代理的端口号。其他选项,如setClientLogin、setClientPasscode、setSystemLogin、setSystemPasscode、setTcpKeepAlive、setTcpNoDelay、setVirtualHost、setRelayConnectTimeout等,可根据您的要求自定义配置。

关于您的其他解决方案:

  • 不建议在生产环境中使用简单(内存)代理,因为它不支持集群、持久性和其他高级功能。它仅适用于开发和测试目的。
  • 使用具有VM传输的单独ActiveMQ实例也是可能的。然而,这种方法可能会增加系统的复杂性,因为您将不得不管理和维护两个ActiveMQ实例而不是一个。此外,您可能需要分别为两个实例配置代理配置,这可能会导致额外的维护开销。在这种情况下,使用带有故障转移传输的RelayConnectionFactory是一种更简单、更可扩展的解决方案。

0
以下是一个具有两个代理的故障转移设置示例配置:
@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 方法则指定了客户端和系统的登录凭据。


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