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"); + } +}