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.