如何使用spring-messaging-5.1。*连接stomp + ssl代理?

时间:2018-11-01 16:29:48

标签: spring-boot ssl websocket stomp amazon-mq

我想在websocket上使用stomp,并打算与Amazon MQ集成,但是Amazon MQ默认使用stomp + ssl,那么我遇到了问题。

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

@Autowired
private ActiveMQProperties activeMQProperties;

/**
 * Register STOMP endpoints mapping each to a specific URL and (optionally)
 * enabling and configuring SockJS fallback options.
 *
 * @param registry
 */
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/endpoint").setAllowedOrigins("*");
}

/**
 * Configure message broker options.
 *
 * @param registry
 */
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.setApplicationDestinationPrefixes("/app");
    registry.enableStompBrokerRelay("/queue", "/topic")
            .setAutoStartup(true)
            .setVirtualHost(activeMQProperties.getHost())
            .setRelayHost(activeMQProperties.getHost())
            .setRelayPort(activeMQProperties.getPort())
            .setSystemLogin(activeMQProperties.getUser())
            .setSystemPasscode(activeMQProperties.getPassword())
            .setClientLogin(activeMQProperties.getUser())
            .setClientPasscode(activeMQProperties.getPassword());
   }}

ReactorNettyTcpClient是spring-messaging-5.1。*中TcpOperations的实现,它如何支持SSL?

2 个答案:

答案 0 :(得分:1)

最近使用ActiveMQ遇到此问题。

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {

    ReactorNettyTcpClient<byte[]> client = new ReactorNettyTcpClient<>(builder -> { 
        builder.port(activeMQProperties.getPort())
               .host(activeMQProperties.getHost())
               .sslSupport(opts -> { /* set SSL options here */})
    }, new StompReactorNettyCodec());

    registry.setApplicationDestinationPrefixes("/app");
    registry.enableStompBrokerRelay("/queue", "/topic")
        .setAutoStartup(true)
        .setVirtualHost(activeMQProperties.getHost())
        .setSystemLogin(activeMQProperties.getUser())
        .setSystemPasscode(activeMQProperties.getPassword())
        .setClientLogin(activeMQProperties.getUser())
        .setClientPasscode(activeMQProperties.getPassword())
        .setTcpClient(client);
}}

答案 1 :(得分:0)

就像一个魅力。我需要做的一件事是稍微更新 TCP 客户端的创建:

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {

    ReactorNettyTcpClient<byte[]> tcpClient = new ReactorNettyTcpClient<>(configurer -> configurer
            .host(properties.getRelayHost())
            .port(properties.getRelayPort())
            .secure(), new StompReactorNettyCodec());

    registry.enableStompBrokerRelay("/queue", "/topic")
            .setAutoStartup(true)
            .setSystemLogin(properties.getClientLogin())
            .setSystemPasscode(properties.getClientPasscode())
            .setClientLogin(properties.getClientLogin())
            .setClientPasscode(properties.getClientPasscode())
            .setTcpClient(tcpClient);

    registry.setApplicationDestinationPrefixes("/app");
    }

依赖:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.4</version>
    <relativePath/>
</parent>
.
.
.
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-stomp</artifactId>
    <version>5.16.2</version>
</dependency>
<dependency>
    <groupId>io.projectreactor.netty</groupId>
    <artifactId>reactor-netty</artifactId>
    <version>1.0.8</version>
</dependency>