Quantcast
Channel: Recent Questions - Stack Overflow
Viewing all articles
Browse latest Browse all 17587

Amazon MQ as broker relay for Spring + Websocket + Stomp is not working

$
0
0

Im not able to connect to Amazon MQ(Active MQ) which i'm setting up broker relay for web-socket connections over STOMP protocol.

Below are few of my configuration attempts

Environment:Spring Boot Version: 2.7.17

Build.gradle

plugins {    id 'org.springframework.boot' version '2.7.17'    id 'io.spring.dependency-management' version '1.0.11.RELEASE'    id 'java'    id 'maven-publish'}repositories {    mavenLocal()    mavenCentral()}dependencies {    implementation 'org.springframework.boot:spring-boot-starter-websocket'    implementation 'org.webjars:stomp-websocket:2.3.3'    implementation 'org.springframework.boot:spring-boot-starter-amqp:2.7.9'    implementation 'io.netty:netty-all:4.1.59.Final'    implementation 'io.projectreactor.netty:reactor-netty:1.0.12'    testImplementation 'org.springframework.boot:spring-boot-starter-test'}group = 'com.dailycodebuffer'version = '0.0.1-SNAPSHOT'description = 'spring-websocket'bootJar {    mainClassName = 'com.xxx.SpringBootApp'}publishing {    publications {        maven(MavenPublication) {            from(components.java)        }    }}tasks.withType(JavaCompile) {    options.encoding = 'UTF-8'}tasks.withType(Javadoc) {    options.encoding = 'UTF-8'}

Amazon MQ setup

OpenWire -> ssl://abc.amazonaws.com:61617
STOMP -> stomp+ssl://abc.amazonaws.com:61614

application.properties

relay.host= my.amazonaws.com

relay.port= 61617

relay.host.user= myuser

relay.host.password= my pwd

My first Websocket Configuration attempt is below

    @Configuration@EnableWebSocketMessageBrokerpublic class WebSocketConfig implements WebSocketMessageBrokerConfigurer {    @Value("${relay.host}")    private String host;    @Value("${relay.port}")    private int port;    @Value("${relay.host.user}")    private String user;    @Value("${relay.host.password}")    private String password;    @Override    public void configureMessageBroker(MessageBrokerRegistry registry) {        final ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();        threadPoolTaskScheduler.setPoolSize(1);        threadPoolTaskScheduler.initialize();        threadPoolTaskScheduler.setThreadNamePrefix("wss-heartbeat-thread-");        final ReactorNettyTcpClient<byte[]> client = new ReactorNettyTcpClient<>(tcpClient -> tcpClient                  .host(host)                  .port(port)                  .secure(), new StompReactorNettyCodec());        registry.enableStompBrokerRelay("/queue/", "/topic/")                .setTcpClient(client)                .setAutoStartup(true)                .setClientLogin(user)                .setClientPasscode(password)                .setSystemLogin(user)                .setSystemPasscode(password)                .setTaskScheduler(threadPoolTaskScheduler);             registry.setApplicationDestinationPrefixes("/app");        registry.setPreservePublishOrder(true);    }    @Override    public void registerStompEndpoints(final StompEndpointRegistry registry) {        final RequestUpgradeStrategy upgradeStrategy = new TomcatRequestUpgradeStrategy();        registry.addEndpoint("/chat")                .setHandshakeHandler(new DefaultHandshakeHandler(upgradeStrategy))                .setAllowedOrigins("*");    }    @Override    public void configureClientInboundChannel(ChannelRegistration registration) {        registration.interceptors(new AuthChannelInterceptor());    }   }

Error

2024-05-09 19:54:17.221  INFO 19660 --- [ent-scheduler-6] o.s.m.s.s.StompBrokerRelayMessageHandler : TCP connection failure in session _system_: Transport failure: org.springframework.messaging.simp.stomp.StompConversionException: '\r' must be followed by '\n'Caused by: org.springframework.messaging.simp.stomp.StompConversionException: '\r' must be followed by '\n'    at org.springframework.messaging.simp.stomp.StompDecoder.tryConsumeEndOfLine(StompDecoder.java:357) ~[spring-messaging-5.3.14.jar:5.3.14]    at org.springframework.messaging.simp.stomp.StompDecoder.readCommand(StompDecoder.java:217) ~[spring-messaging-5.3.14.jar:5.3.14]    at org.springframework.messaging.simp.stomp.StompDecoder.decodeMessage(StompDecoder.java:143) ~[spring-messaging-5.3.14.jar:5.3.14]    at org.springframework.messaging.simp.stomp.StompDecoder.decode(StompDecoder.java:115) ~[spring-messaging-5.3.14.jar:5.3.14]    at org.springframework.messaging.simp.stomp.StompDecoder.decode(StompDecoder.java:88) ~[spring-messaging-5.3.14.jar:5.3.14]    at org.springframework.messaging.simp.stomp.StompReactorNettyCodec.decodeInternal(StompReactorNettyCodec.java:54) ~[spring-messaging-5.3.14.jar:5.3.14]    at org.springframework.messaging.tcp.reactor.AbstractNioBufferReactorNettyCodec.decode(AbstractNioBufferReactorNettyCodec.java:41) ~[spring-messaging-5.3.14.jar:5.3.14]    at org.springframework.messaging.tcp.reactor.ReactorNettyTcpClient$StompMessageDecoder.decode(ReactorNettyTcpClient.java:348) ~[spring-messaging-5.3.14.jar:5.3.14]    at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:508) ~[netty-all-4.1.59.Final.jar:4.1.59.Final]    at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:447) ~[netty-all-4.1.59.Final.jar:4.1.59.Final]

Note : We also tried with STOMP port 61614 and that results in the following error.

2024-05-09 20:08:36.531  INFO 23700 --- [ient-loop-nio-3] o.s.m.s.s.StompBrokerRelayMessageHandler : TCP connection failure in session _system_: Failed to connect: handshake timed out after 10000msio.netty.handler.ssl.SslHandshakeTimeoutException: handshake timed out after 10000ms

My second Websocket Configuration attempt is below

@Configuration@EnableWebSocketMessageBrokerpublic class WebSocketConfig implements WebSocketMessageBrokerConfigurer {    @Value("${relay.host}")    private String host;    @Value("${relay.port}")    private int port;    @Value("${relay.host.user}")    private String user;    @Value("${relay.host.password}")    private String password;    @Override    public void configureMessageBroker(MessageBrokerRegistry registry) {        final ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();        threadPoolTaskScheduler.setPoolSize(1);        threadPoolTaskScheduler.initialize();        threadPoolTaskScheduler.setThreadNamePrefix("wss-heartbeat-thread-");        final ReactorNettyTcpClient<byte[]> client = new ReactorNettyTcpClient<>(tcpClient -> tcpClient                  .host(host)                  .port(61617)//Open-wire SSL port                  .secure(), new StompReactorNettyCodec());        registry.enableStompBrokerRelay("/queue/", "/topic/")                .setTcpClient(client)                .setAutoStartup(true)                .setRelayHost(host)                .setRelayPort(61614) //STOMP port                .setClientLogin(user)                .setClientPasscode(password)                .setSystemLogin(user)                .setSystemPasscode(password)                .setTaskScheduler(threadPoolTaskScheduler);             registry.setApplicationDestinationPrefixes("/app");        registry.setPreservePublishOrder(true);    }    @Override    public void registerStompEndpoints(final StompEndpointRegistry registry) {        final RequestUpgradeStrategy upgradeStrategy = new TomcatRequestUpgradeStrategy();        registry.addEndpoint("/chat")                .setHandshakeHandler(new DefaultHandshakeHandler(upgradeStrategy))                .setAllowedOrigins("*");    }

It also fails with

2024-05-09 20:14:11.863  INFO 1724 --- [ent-scheduler-8] o.s.m.s.s.StompBrokerRelayMessageHandler : TCP connection failure in session _system_: Transport failure: org.springframework.messaging.simp.stomp.StompConversionException: '\r' must be followed by '\n'io.netty.handler.codec.DecoderException: org.springframework.messaging.simp.stomp.StompConversionException: '\r' must be followed by '\n'

My third Websocket Configuration attempt is below

@Configuration@EnableWebSocketMessageBrokerpublic class WebSocketConfig implements WebSocketMessageBrokerConfigurer {    @Value("${relay.host}")    private String host;    @Value("${relay.port}")    private int port;    @Value("${relay.host.user}")    private String user;    @Value("${relay.host.password}")    private String password;    @Override    public void configureMessageBroker(MessageBrokerRegistry registry) {        final ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();        threadPoolTaskScheduler.setPoolSize(1);        threadPoolTaskScheduler.initialize();        threadPoolTaskScheduler.setThreadNamePrefix("wss-heartbeat-thread-");        registry.enableStompBrokerRelay("/queue/", "/topic/")                .setAutoStartup(true)                .setRelayHost(host)                .setRelayPort(port) //Open-wire SSL port                .setClientLogin(user)                .setClientPasscode(password)                .setSystemLogin(user)                .setSystemPasscode(password)                .setTaskScheduler(threadPoolTaskScheduler);             registry.setApplicationDestinationPrefixes("/app");        registry.setPreservePublishOrder(true);    }    @Override    public void registerStompEndpoints(final StompEndpointRegistry registry) {        final RequestUpgradeStrategy upgradeStrategy = new TomcatRequestUpgradeStrategy();        registry.addEndpoint("/chat")                .setHandshakeHandler(new DefaultHandshakeHandler(upgradeStrategy))                .setAllowedOrigins("*");    }    @Override    public void configureClientInboundChannel(ChannelRegistration registration) {        registration.interceptors(new AuthChannelInterceptor());    }   }

In this case server starts successfully without any connection failure but when publishing message to the broker, im getting the following Message broker not active error.

2024-05-09 20:30:53.778 ERROR 30512 --- [nio-8083-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.messaging.MessageDeliveryException: Message broker not active. Consider subscribing to receive BrokerAvailabilityEvent's from an ApplicationListener Spring bean.] with root causeorg.springframework.messaging.MessageDeliveryException: Message broker not active. Consider subscribing to receive BrokerAvailabilityEvent's from an ApplicationListener Spring bean.

Any help to get this working, would be much appreciated.


Viewing all articles
Browse latest Browse all 17587

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>