Użyłem obrazu Docker Rabbitmq, który został włączony. Dzięki następującą konfigurację, gdy próbuję uruchomić moją aplikację Boot, otrzymuję wyjątek.

Stacktrace :

2020-11-21 16: 03: 07.620 Info 28504 --- [IEN-LOOP-NIO-1] OSMSSSStompBrokerrelayMessageHandler: Awaria połączenia TCP w systemie sesji : Nie udało się podłączyć: połączenie odrzucone: /127,0 .0.1: 61613.

IO.netty.Channel.abstractchannel $ AnnotatedConnectException: Połączenie odrzucone: /127.0.0.1:61613 Spowodowane przez: java.net.ConnectException: Połączenie odrzucone na sun.nio.ch.socketchanBannelimpl.CheckConnect (metoda rodzimy) ~ [NA: 1.8. 0_242] W sun.nio.ch.socketchetsCanelimpl.finishConnect (Socketchannelimpl.java:714) ~ [NA: 1.8.0_242] w io.netty.channel.socket.nio.nioscethannel.dofinishConnect (niosocketchannel.java:330) ~ [ Netty-Transport-4.1.51.Final.jar: 4.1.51.Final] w Io.netty.Channel.nio.abstractionniochannel $ abstractniounsafe.finishConnect (abstractniochannel.java:334) ~ [Netty-transport-4.1.51.Final JAR: 4.1.51.Final] w io.netty.channel.nio.NioEventLoop.processSelectedKey (NioEventLoop.java:702) ~ [netty transportowy-4.1.51.Final.jar: 4.1.51.Final] przy wy .NETTY.Channel.nio.nioeventloop.Processelektrytykeysoptemized (NIOEVENTLOOP.Java:650) ~ [Netty-Transport-4.1.51.Final.jar: 4.1.51.final] w io.netty.Channel.nio.nioeventloop.Processelektrytyki ( NioEventloop.java:576) ~ [Netty-Transport-4.1.51.Final.jar: 4.1.51 .Final] w io.netty.Channel.nio.nioeventloop.Run (NioEventloop.java:493) ~ [Netty-Transport-4.1.51.Final.jar: 4.1.51.final] w io.netty.util.concurrent .SingLethreadeMentexecutor $ 4.Run (SingletleTreadeventexecutor.java:989) ~ [Netty-Common-4.1.51.Final.jar: 4.1.51.Final] w Io.netty.util.Internal.Threadexecutormap $ 2.Run (WILETEXECUTORMAP.java: 74) ~ [Netty-Common-4.1.51.Final.jar: 4.1.51.Final] w io.netty.Util.concurrent.fastthreadLocalUnNable.Run (FastThreadLocalUnNable.java:30) ~ [Netty-Common-4.1.51 .Final.jar: 4.1.51.Final] w Java.lang.Thread.run (Wątek

Dockerfile

FROM rabbitmq:3-management
RUN rabbitmq-plugins enable --offline rabbitmq_stomp
EXPOSE 61613

Dzienniki z kontenera Rabbitmq wyglądają dla mnie w porządku.

enter image description here

WebSocketConfig.java Wygląda na:

@EnableWebSocketMessageBroker
@Configuration
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

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

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.enableStompBrokerRelay("/topic", "/queue")
            .setRelayPort(61613)
            .setRelayHost("127.0.0.1")
            .setClientPasscode("guest")
            .setClientLogin("guest");
    registry.setApplicationDestinationPrefixes("/ws");
}
}

pom.xml

    <dependency>
        <groupId>io.projectreactor.netty</groupId>
        <artifactId>reactor-netty</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>

Co jest nie tak z konfiguracją? Czy ktoś może mi pomóc?

1
Suraj Gautam 21 listopad 2020, 13:25

1 odpowiedź

Najlepsza odpowiedź

Myślę, że popełniłeś błąd podczas wystawiania rabbitmq Stomp Port 61613 dla klienta. Nawiasem mówiąc, przetestowałem podobną konfigurację, które działa dla mnie.

W celu wdrożenia sprawdź moją aplikację demonstracyjną na Github czytaj następujące dane.

Dockerfile

FROM rabbitmq:3-management

RUN rabbitmq-plugins enable --offline rabbitmq_stomp

EXPOSE 15671 15672 61613

Wdrożenie serwera

Umowa wiadomości

public class ZbytesMessage {

    private String from;
    private String text;

    ...getters and setters...

}

konfiguracja w serwisie WWW

@Configuration
@EnableWebSocketMessageBroker
public class StompConfig implements WebSocketMessageBrokerConfigurer {

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

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableStompBrokerRelay("/topic", "/queue")
                .setRelayHost("localhost")
                .setRelayPort(61613)
                .setClientLogin("guest")
                .setClientPasscode("guest");
        config.setApplicationDestinationPrefixes("/zbytes");
    }
}

kontroler internetowy

@Controller
public class ZbytesController {

    private static final Logger LOG = LoggerFactory.getLogger(ZbytesController.class);

    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public ZbytesMessage greeting(ZbytesMessage msg) throws Exception {
        Thread.sleep(1000); // simulated delay
        LOG.info("Received : {} from: {} ", msg.getText(), msg.getFrom());
        return msg;
    }
}

biegacz serwera

@SpringBootApplication
public class ServerRunner {

    public static void main(String[] args) {
        SpringApplication.run(ServerRunner.class, args);
    }

}

Wdrożenie klienta

public class HelloClient {

    private static final WebSocketHttpHeaders headers = new WebSocketHttpHeaders();
    private static final Logger LOG = LoggerFactory.getLogger(HelloClient.class);

    public static void main(String[] args) throws Exception {
        HelloClient helloClient = new HelloClient();

        ListenableFuture<StompSession> f = helloClient.connect();
        StompSession stompSession = f.get();

        LOG.info("Subscribing to greeting topic using session {}", stompSession);
        helloClient.subscribeGreetings(stompSession);

        LOG.info("Sending hello message {}", stompSession);
        helloClient.sendHello(stompSession);
        Thread.sleep(60000);
    }

    public ListenableFuture<StompSession> connect() {

        Transport webSocketTransport = new WebSocketTransport(new StandardWebSocketClient());
        List<Transport> transports = Collections.singletonList(webSocketTransport);

        SockJsClient sockJsClient = new SockJsClient(transports);
        sockJsClient.setMessageCodec(new Jackson2SockJsMessageCodec());

        WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);

        String url = "ws://{host}:{port}/zsockets";
        return stompClient.connect(url, headers, new MyHandler(), "localhost", 8080);
    }

    public void subscribeGreetings(StompSession stompSession) {
        stompSession.subscribe("/topic/greetings", new StompFrameHandler() {

            public Type getPayloadType(StompHeaders stompHeaders) {
                return byte[].class;
            }

            public void handleFrame(StompHeaders stompHeaders, Object o) {
                LOG.info("Received greeting {}", new String((byte[]) o));
            }
        });
    }

    public void sendHello(StompSession stompSession) {
        String jsonHello = "{ \"from\" : \"suraj\", \"text\" : \"Hi zbytes!\" }";
        stompSession.send("/zbytes/hello", jsonHello.getBytes());
    }

    private static class MyHandler extends StompSessionHandlerAdapter {
        @Override
        public void afterConnected(StompSession stompSession, StompHeaders stompHeaders) {
            LOG.info("Now connected");
        }
    }

}

, aby uruchomić

  • Zbuduj obraz dokera i uruchom go (nie zapomnij odsłonić Port 61613). (Uwaga: Wolałbym Docker-Compose.yaml)
docker build -t zbytes/rabbitmq .
docker run -p61613:61613 zbytes/rabbitmq
  • Run ServerRunner klasa główna Java.
  • Run HelloClient klasa główna Java.

Wyjście serwera

i.g.zbytes.demo.server.ZbytesController  : Received : Hi zbytes! from: suraj 

Wyjście klienta

Received greeting {"from":"suraj","text":"Hi zbytes!"}
1
Bhuwan Prasad Upadhyay 21 listopad 2020, 14:19