Messaging With STOMP Over WebSockets using Spring Angular ActiveMQ
Web Socket
I will create push notify messaging with STOMP over WebSockets using Spring and ActiveMQ.
You might have seen similar tutorial at link WebSockets Using Spring Boot And Angular, but I used in-memory message broker but here I will use external message broker – ActiveMQ. I will use Angular for building front end or UI where message will be updated and displayed.I will use the same tutorial with some modification to the existing code.
Prerequisites
ActiveMQ 5.15.9/5.18.3, Netty API, ActiveMQ API, ActiveMQ STOMP API
Spring Boot WebSocket Angular Example
Configuring ActiveMQ
Please look at the tutorial how to configure ActiveMQ.
Project Setup
I am assuming that you are following the same tutorial at Spring Boot WebSocket Angular Example.
For the maven based project you can use the following pom.xml file:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.roytuts</groupId>
<artifactId>Spring-WebSocket-ActiveMQ</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>19</maven.compiler.source>
<maven.compiler.target>19</maven.compiler.target>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.5</version>
</parent>
<dependencies>
<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>io.projectreactor.netty</groupId>
<artifactId>reactor-netty</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Update the build.gradle file with the following content.
buildscript {
ext {
springBootVersion = '2.1.8.RELEASE'
}
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
sourceCompatibility = 12
targetCompatibility = 12
repositories {
mavenLocal()
mavenCentral()
maven {
url 'https://artifacts.alfresco.com/nexus/content/repositories/public/'
}
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-websocket:${springBootVersion}")
implementation("org.springframework.boot:spring-boot-starter-activemq:${springBootVersion}")
implementation("org.apache.activemq:activemq-stomp:5.15.10")
implementation("io.projectreactor.netty:reactor-netty:0.8.11.RELEASE")
} Updating POJO
Update the POJO class Message to implement Serializable interface as you are going to use external message broker – ActiveMQ.
package com.roytuts.spring.websocket.vo;
public class Message implements Serializable {
private static final long serialVersionUID = 1L;
private String msg;
public Message(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
} Updating WebSocket Configuration
Updating WebSocket configuration class WebSocketConfig for configuring ActiveMQ with STOMP.
I have enabled stompBrokerRelay with ActiveMQ host and port.
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
// registry.addEndpoint("/websocket").setAllowedOrigins("*").withSockJS(); //
// spring boot 2.x.x
registry.addEndpoint("/websocket").setAllowedOrigins("http://localhost:4200").withSockJS(); // spring boot 3.x.x
}
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableStompBrokerRelay("/topic").setRelayHost("localhost").setRelayPort(61613).setClientLogin("admin")
.setClientPasscode("admin");
config.setApplicationDestinationPrefixes("/app");
}
} You don’t need to update the client application.
Running ActiveMQ Broker
Execute command from command line tool after navigating to the appropriate bin directory of ActiveMQ 5.15.9/5.18.3.
\apache-activemq-5.xy.z\bin\start activemq
Related Posts:
Testing the Application
Make sure you run the server application followed by client application.
Then your client application will open at http://localhost:4200 in the browser and you will see the similar kind of message as you had seen for the output of Spring Boot WebSocket Angular Example.
nice article