Метод отсутствует в классе Spring Boot Websocket - PullRequest
0 голосов
/ 16 января 2020

Я работаю над приложением, использующим пружинные веб-сокеты, и хочу подключиться к брокеру сообщений AmazonMQ. Я настроил свой класс MessageBroker, но не могу подключиться.

package com.projectC.config;

import io.netty.handler.ssl.SslProvider;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.messaging.simp.stomp.StompReactorNettyCodec;
import org.springframework.messaging.tcp.reactor.ReactorNettyTcpClient;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;


@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/queue");
        config.enableStompBrokerRelay("/queue")
                .setRelayHost("b-xxxxxxxxxxxxxx.mq.region.amazonaws.com")
                .setRelayPort(61614)
                .setSystemLogin("user")
                .setSystemPasscode("password")
                .setClientLogin("user")
                .setClientPasscode("password");
        config.setApplicationDestinationPrefixes("/app");
        config.setUserDestinationPrefix("/user");
    }

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

}

Насколько я понимаю, проблема заключается в том, что AmazonMq использует stomp + ssl. Я нашел несколько решений этой проблемы, но все они, похоже, используют метод, который отсутствует в моей программе.

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
    ReactorNettyTcpClient<byte[]> client = new ReactorNettyTcpClient<>(tcpClient -> tcpClient
            .host("your-amazon-mq-host.amazonaws.com")
            .port(61614)
            .secure(SslProvider.defaultClientProvider()), new StompReactorNettyCodec());

    registry.setApplicationDestinationPrefixes("/app");
    registry.enableStompBrokerRelay("/queue", "/topic")
            .setAutoStartup(true)
            .setSystemLogin("amazonmq-login")
            .setSystemPasscode("amazonmq-pass")
            .setClientLogin("amazonmq-login")
            .setClientPasscode("amazonmq-pass")
            .setTcpClient(client);
}

Мне не хватает функции setTcpClient (). Функция появляется в документации, но отсутствует в моей программе. Я попытался использовать обычную весеннюю зависимость websocket вместо загрузочной, но все равно ничего. Вот мое ПОМ:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
        <relativePath />  
    </parent>
    <groupId>com</groupId>
    <artifactId>projectC</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>projectC</name>
    <description>Multiplayer online card game.</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</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>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-reactor-netty</artifactId>
        </dependency>


        <!--#PRODUCTION-->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>   
        <!--#PRODUCTION-->

        <!--#DEV-->        
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>   
        <!--#DEV-->
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

У вас, ребята, есть идеи, как использовать этот метод, даже если мне его не хватает?

...