diff --git a/maven-modules/maven-parent-pom-resolution/project-a/project-b/pom.xml b/maven-modules/maven-parent-pom-resolution/aggregator/module1/pom.xml
similarity index 69%
rename from maven-modules/maven-parent-pom-resolution/project-a/project-b/pom.xml
rename to maven-modules/maven-parent-pom-resolution/aggregator/module1/pom.xml
index e3f5239efe..01b522748f 100644
--- a/maven-modules/maven-parent-pom-resolution/project-a/project-b/pom.xml
+++ b/maven-modules/maven-parent-pom-resolution/aggregator/module1/pom.xml
@@ -3,11 +3,11 @@
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">
4.0.0
- project-b
+ module1
- com.baeldung
- project-a
- 1.0-SNAPSHOT
+ com.baeldung.maven-parent-pom-resolution
+ aggregator
+ 1.0.0-SNAPSHOT
pom
diff --git a/maven-modules/maven-parent-pom-resolution/project-a/project-c/project-d/pom.xml b/maven-modules/maven-parent-pom-resolution/aggregator/module2/module3/pom.xml
similarity index 75%
rename from maven-modules/maven-parent-pom-resolution/project-a/project-c/project-d/pom.xml
rename to maven-modules/maven-parent-pom-resolution/aggregator/module2/module3/pom.xml
index 973e44eb1f..da0193be10 100644
--- a/maven-modules/maven-parent-pom-resolution/project-a/project-c/project-d/pom.xml
+++ b/maven-modules/maven-parent-pom-resolution/aggregator/module2/module3/pom.xml
@@ -3,11 +3,11 @@
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">
4.0.0
- project-d
+ module3
- com.baeldung
- project-a
- 1.0-SNAPSHOT
+ com.baeldung.maven-parent-pom-resolution
+ aggregator
+ 1.0.0-SNAPSHOT
../../pom.xml
diff --git a/maven-modules/maven-parent-pom-resolution/project-a/project-c/pom.xml b/maven-modules/maven-parent-pom-resolution/aggregator/module2/pom.xml
similarity index 62%
rename from maven-modules/maven-parent-pom-resolution/project-a/project-c/pom.xml
rename to maven-modules/maven-parent-pom-resolution/aggregator/module2/pom.xml
index 3c7f70ae20..bf9c89ecf4 100644
--- a/maven-modules/maven-parent-pom-resolution/project-a/project-c/pom.xml
+++ b/maven-modules/maven-parent-pom-resolution/aggregator/module2/pom.xml
@@ -3,18 +3,18 @@
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">
4.0.0
- project-c
+ module2
- com.baeldung
- project-b
- 1.0-SNAPSHOT
- ../project-b/pom.xml
+ com.baeldung.maven-parent-pom-resolution
+ module1
+ 1.0.0-SNAPSHOT
+ ../module1/pom.xml
pom
- project-d
+ module3
diff --git a/maven-modules/maven-parent-pom-resolution/project-a/pom.xml b/maven-modules/maven-parent-pom-resolution/aggregator/pom.xml
similarity index 72%
rename from maven-modules/maven-parent-pom-resolution/project-a/pom.xml
rename to maven-modules/maven-parent-pom-resolution/aggregator/pom.xml
index 2d53a36d84..0067dfc009 100644
--- a/maven-modules/maven-parent-pom-resolution/project-a/pom.xml
+++ b/maven-modules/maven-parent-pom-resolution/aggregator/pom.xml
@@ -3,18 +3,19 @@
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">
4.0.0
- project-a
+ com.baeldung.maven-parent-pom-resolution
+ aggregator
com.baeldung
maven-parent-pom-resolution
- 1.0-SNAPSHOT
+ 1.0.0-SNAPSHOT
pom
- project-b
- project-c
+ module1
+ module2
diff --git a/maven-modules/maven-parent-pom-resolution/pom.xml b/maven-modules/maven-parent-pom-resolution/pom.xml
index 62e3946723..d5a96c0998 100644
--- a/maven-modules/maven-parent-pom-resolution/pom.xml
+++ b/maven-modules/maven-parent-pom-resolution/pom.xml
@@ -5,11 +5,11 @@
4.0.0
com.baeldung
maven-parent-pom-resolution
- 1.0-SNAPSHOT
+ 1.0.0-SNAPSHOT
pom
- project-a
+ aggregator
diff --git a/persistence-modules/spring-data-mongodb-reactive/README.md b/persistence-modules/spring-data-mongodb-reactive/README.md
index 0931161700..4fbdb87785 100644
--- a/persistence-modules/spring-data-mongodb-reactive/README.md
+++ b/persistence-modules/spring-data-mongodb-reactive/README.md
@@ -8,5 +8,3 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
### Relevant Articles
- [Spring Data Reactive Repositories with MongoDB](https://www.baeldung.com/spring-data-mongodb-reactive)
- [Spring Data MongoDB Tailable Cursors](https://www.baeldung.com/spring-data-mongodb-tailable-cursors)
-- [A Quick Look at R2DBC with Spring Data](https://www.baeldung.com/spring-data-r2dbc)
-- [Spring Data Reactive Repositories with Couchbase](https://www.baeldung.com/spring-data-reactive-couchbase)
diff --git a/spring-5-data-reactive/README.md b/spring-5-data-reactive/README.md
index 0931161700..ecb6d01267 100644
--- a/spring-5-data-reactive/README.md
+++ b/spring-5-data-reactive/README.md
@@ -6,7 +6,5 @@ This module contains articles about reactive Spring 5 Data
The "REST With Spring" Classes: http://bit.ly/restwithspring
### Relevant Articles
-- [Spring Data Reactive Repositories with MongoDB](https://www.baeldung.com/spring-data-mongodb-reactive)
-- [Spring Data MongoDB Tailable Cursors](https://www.baeldung.com/spring-data-mongodb-tailable-cursors)
- [A Quick Look at R2DBC with Spring Data](https://www.baeldung.com/spring-data-r2dbc)
- [Spring Data Reactive Repositories with Couchbase](https://www.baeldung.com/spring-data-reactive-couchbase)
diff --git a/spring-websockets/src/main/java/com/baeldung/rawwebsocket/ServerWebSocketConfig.java b/spring-websockets/src/main/java/com/baeldung/rawwebsocket/ServerWebSocketConfig.java
new file mode 100644
index 0000000000..5218140d2c
--- /dev/null
+++ b/spring-websockets/src/main/java/com/baeldung/rawwebsocket/ServerWebSocketConfig.java
@@ -0,0 +1,23 @@
+package com.baeldung.rawwebsocket;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.WebSocketHandler;
+import org.springframework.web.socket.config.annotation.EnableWebSocket;
+import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
+import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
+
+@Configuration
+@EnableWebSocket
+public class ServerWebSocketConfig implements WebSocketConfigurer {
+
+ @Override
+ public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
+ registry.addHandler(webSocketHandler(), "/websocket");
+ }
+
+ @Bean
+ public WebSocketHandler webSocketHandler() {
+ return new ServerWebSocketHandler();
+ }
+}
diff --git a/spring-websockets/src/main/java/com/baeldung/rawwebsocket/ServerWebSocketHandler.java b/spring-websockets/src/main/java/com/baeldung/rawwebsocket/ServerWebSocketHandler.java
new file mode 100644
index 0000000000..ed1ac8edc3
--- /dev/null
+++ b/spring-websockets/src/main/java/com/baeldung/rawwebsocket/ServerWebSocketHandler.java
@@ -0,0 +1,72 @@
+package com.baeldung.rawwebsocket;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.web.socket.CloseStatus;
+import org.springframework.web.socket.SubProtocolCapable;
+import org.springframework.web.socket.TextMessage;
+import org.springframework.web.socket.WebSocketSession;
+import org.springframework.web.socket.handler.TextWebSocketHandler;
+import org.springframework.web.util.HtmlUtils;
+
+import java.io.IOException;
+import java.time.LocalTime;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+public class ServerWebSocketHandler extends TextWebSocketHandler implements SubProtocolCapable {
+
+ private static final Logger logger = LoggerFactory.getLogger(ServerWebSocketHandler.class);
+
+ private final Set sessions = new CopyOnWriteArraySet<>();
+
+ @Override
+ public void afterConnectionEstablished(WebSocketSession session) throws Exception {
+ logger.info("Server connection opened");
+ sessions.add(session);
+
+ TextMessage message = new TextMessage("one-time message from server");
+ logger.info("Server sends: {}", message);
+ session.sendMessage(message);
+ }
+
+ @Override
+ public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
+ logger.info("Server connection closed: {}", status);
+ sessions.remove(session);
+ }
+
+ @Scheduled(fixedRate = 10000)
+ void sendPeriodicMessages() throws IOException {
+ for (WebSocketSession session : sessions) {
+ if (session.isOpen()) {
+ String broadcast = "server periodic message " + LocalTime.now();
+ logger.info("Server sends: {}", broadcast);
+ session.sendMessage(new TextMessage(broadcast));
+ }
+ }
+ }
+
+ @Override
+ public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
+ String request = message.getPayload();
+ logger.info("Server received: {}", request);
+
+ String response = String.format("response from server to '%s'", HtmlUtils.htmlEscape(request));
+ logger.info("Server sends: {}", response);
+ session.sendMessage(new TextMessage(response));
+ }
+
+ @Override
+ public void handleTransportError(WebSocketSession session, Throwable exception) {
+ logger.info("Server transport error: {}", exception.getMessage());
+ }
+
+ @Override
+ public List getSubProtocols() {
+ return Collections.singletonList("subprotocol.demo.websocket");
+ }
+}