How do you configure STOMP over WebSocket in Spring Boot?
Table of Contents
- Introduction
- Step 1: Add Dependencies
- Step 2: Configure WebSocket and STOMP
- Step 3: Create a Controller to Handle STOMP Messages
- Step 4: Create a Simple HTML Frontend
- Step 5: Run the Application
- Step 6: Enhancements (Optional)
- Conclusion
Introduction
STOMP (Simple Text Oriented Messaging Protocol) over WebSocket is a popular choice for building real-time messaging systems. It is supported in Spring Boot through Spring WebSocket and Spring Messaging. In this guide, we'll demonstrate how to configure STOMP over WebSocket in a Spring Boot application, allowing clients to send and receive real-time messages via a WebSocket connection using the STOMP protocol.
Step 1: Add Dependencies
You need to include the necessary dependencies for WebSocket and STOMP in your pom.xml
.
pom.xml
Dependencies
These dependencies include support for both WebSocket and STOMP, enabling message handling over WebSocket.
Step 2: Configure WebSocket and STOMP
You need to configure WebSocket support and enable STOMP messaging by creating a configuration class.
WebSocketConfig.java
Explanation:
@EnableWebSocketMessageBroker
: This annotation enables WebSocket message handling and STOMP protocol in the Spring context.configureMessageBroker()
: This configures the message broker for handling messages. TheenableSimpleBroker
method is used to enable the message broker that handles messages sent to destinations prefixed with/topic
and/queue
. This is where messages will be broadcasted to clients.setApplicationDestinationPrefixes("/app")
: This sets the prefix for the application-level endpoints where messages from clients will be routed.registerStompEndpoints()
: This method registers the WebSocket endpoint (/ws
) that clients will connect to. It also enables SockJS fallback options to handle scenarios where WebSocket is not supported.
Step 3: Create a Controller to Handle STOMP Messages
Next, create a controller that will handle incoming STOMP messages and broadcast them to the clients.
ChatController.java
Explanation:
@MessageMapping("/sendMessage")
: This annotation listens for incoming messages from clients that are sent to the/app/sendMessage
destination.@SendTo("/topic/messages")
: After receiving the message, the controller sends the message to the/topic/messages
destination. All clients subscribed to this topic will receive the broadcasted message.
Step 4: Create a Simple HTML Frontend
Now, create a simple frontend to interact with the WebSocket and STOMP services. We'll use SockJS for fallback options and Stomp.js to handle STOMP messaging on the client side.
src/main/resources/static/chat.html
Explanation:
- SockJS and STOMP.js: These libraries handle WebSocket connections and the STOMP protocol on the client side.
stompClient.connect()
: This establishes a connection to the/ws
WebSocket endpoint and subscribes to the/topic/messages
destination.stompClient.send()
: This sends messages to the/app/sendMessage
destination, where the Spring Boot controller handles them.
Step 5: Run the Application
To run the application:
- Run the Spring Boot application using
mvn spring-boot:run
. - Open multiple browser tabs and navigate to
http://localhost:8080/chat.html
. - Send messages from one client and watch them be broadcast to all connected clients in real-time.
Step 6: Enhancements (Optional)
- User Authentication: Add user authentication by sending a username with each message and displaying the sender’s name in the chat.
- Private Messaging: Implement private messaging by adding routing logic in the controller and allowing clients to send messages to specific users.
- Message Persistence: Use a database or caching system (like Redis) to persist messages, allowing users to view chat history after reconnecting.
Conclusion
In this guide, we demonstrated how to configure STOMP over WebSocket in Spring Boot to build a real-time messaging chat application. We covered the necessary dependencies, configuration, controller setup, and frontend implementation. This architecture allows for easy extension, such as adding user authentication, private messaging, and message persistence. By using STOMP and WebSocket, you can build scalable and efficient real-time communication systems in your Spring Boot applications.