From 8713c6e7b369eee0686f7c3fdda1bcbf873dde4c Mon Sep 17 00:00:00 2001 From: Lumijiez Date: Mon, 25 Nov 2024 16:56:06 +0200 Subject: [PATCH] Identity, port, hostname acknowledgement --- .../main/java/io/github/lumijiez/Main.java | 27 ++++++++++-- .../github/lumijiez/data/models/NodeInfo.java | 3 ++ .../src/main/resources/log4j2.xml | 2 +- .../io/github/lumijiez/JavalinConfig.java | 44 ++++++++++++------- .../src/main/resources/log4j2.xml | 2 +- SymphonyManager/src/main/resources/log4j2.xml | 2 +- .../src/main/resources/log4j2.xml | 2 +- SymphonySMTP/src/main/resources/log4j2.xml | 2 +- docker-compose.yml | 15 +++++++ 9 files changed, 74 insertions(+), 25 deletions(-) create mode 100644 SymphonyDatabaseNode/src/main/java/io/github/lumijiez/data/models/NodeInfo.java diff --git a/SymphonyDatabaseNode/src/main/java/io/github/lumijiez/Main.java b/SymphonyDatabaseNode/src/main/java/io/github/lumijiez/Main.java index e114218..b15016a 100644 --- a/SymphonyDatabaseNode/src/main/java/io/github/lumijiez/Main.java +++ b/SymphonyDatabaseNode/src/main/java/io/github/lumijiez/Main.java @@ -1,13 +1,19 @@ package io.github.lumijiez; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; import io.github.lumijiez.data.Data; +import io.github.lumijiez.data.models.NodeInfo; import jakarta.persistence.EntityManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import java.lang.reflect.Type; import java.net.URI; import java.net.http.HttpClient; import java.net.http.WebSocket; +import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.concurrent.CountDownLatch; @@ -15,13 +21,17 @@ import java.util.concurrent.CountDownLatch; public class Main { public static Logger logger = LogManager.getLogger(Main.class); private static final CountDownLatch waitForConnection = new CountDownLatch(1); + private static final Gson gson = new Gson(); public static void main(String[] args) { try { + String hostname = System.getenv().getOrDefault("HOSTNAME", "localhost"); + int port = Integer.parseInt(System.getenv().getOrDefault("PORT", "8080")); + logger.info("Node started"); EntityManager em = Data.getEntityManager(); - logger.info("Connected to database: << symphony >>"); + logger.info("Connected to database:\u001B[33m\033[1m symphony"); em.close(); try (HttpClient client = HttpClient.newHttpClient()) { @@ -31,8 +41,15 @@ public class Main { @Override public CompletionStage onText(WebSocket webSocket, CharSequence data, boolean last) { try { - int nodeCount = Integer.parseInt(data.toString()); - logger.info("Acknowledged nodes: {}", nodeCount); + Type nodeListType = new TypeToken>() {}.getType(); + List nodes = gson.fromJson(data.toString(), nodeListType); +//// logger.info("Discovered Nodes (JSON):\n{}", +//// new GsonBuilder() +//// .setPrettyPrinting() +//// .create() +//// .toJson(nodes) +// ); + logger.info("Acknowledged nodes:\u001B[33m\033[1m {}\u001B[0m", nodes.size()); } catch (NumberFormatException e) { logger.error("Received invalid node count: {}", data); } @@ -41,7 +58,9 @@ public class Main { @Override public void onOpen(WebSocket webSocket) { - logger.info("Successfully registered to Discovery"); + NodeInfo nodeInfo = new NodeInfo(hostname, port); + webSocket.sendText(gson.toJson(nodeInfo), true); + logger.info("Successfully registered to \033[1mDiscovery"); waitForConnection.countDown(); WebSocket.Listener.super.onOpen(webSocket); } diff --git a/SymphonyDatabaseNode/src/main/java/io/github/lumijiez/data/models/NodeInfo.java b/SymphonyDatabaseNode/src/main/java/io/github/lumijiez/data/models/NodeInfo.java new file mode 100644 index 0000000..350a7ad --- /dev/null +++ b/SymphonyDatabaseNode/src/main/java/io/github/lumijiez/data/models/NodeInfo.java @@ -0,0 +1,3 @@ +package io.github.lumijiez.data.models; + +public record NodeInfo(String hostname, int port) { } diff --git a/SymphonyDatabaseNode/src/main/resources/log4j2.xml b/SymphonyDatabaseNode/src/main/resources/log4j2.xml index b5c1d56..cf6e96b 100644 --- a/SymphonyDatabaseNode/src/main/resources/log4j2.xml +++ b/SymphonyDatabaseNode/src/main/resources/log4j2.xml @@ -4,7 +4,7 @@ - %highlight{%d{yyyy-MM-dd HH:mm:ss} %-5level [%t]: %msg}{FATAL=red, ERROR=red, WARN=yellow, INFO=green, DEBUG=blue}%n + %d{yyyy-MM-dd HH:mm:ss} %highlight{%-5level}{FATAL=red, ERROR=red, WARN=yellow, INFO=green, DEBUG=blue}: %highlight{%msg}{FATAL=red, ERROR=red}%n diff --git a/SymphonyDiscovery/src/main/java/io/github/lumijiez/JavalinConfig.java b/SymphonyDiscovery/src/main/java/io/github/lumijiez/JavalinConfig.java index 2d33b16..ebae711 100644 --- a/SymphonyDiscovery/src/main/java/io/github/lumijiez/JavalinConfig.java +++ b/SymphonyDiscovery/src/main/java/io/github/lumijiez/JavalinConfig.java @@ -1,34 +1,46 @@ package io.github.lumijiez; +import com.google.gson.Gson; import io.javalin.Javalin; import io.javalin.websocket.WsContext; -import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; public class JavalinConfig { - private static final Map users = new ConcurrentHashMap<>(); + private static final Map registeredNodes = new ConcurrentHashMap<>(); + private static final Map nodes = new ConcurrentHashMap<>(); + private static final Gson gson = new Gson(); public static void setup(Javalin app) { app.ws("/discovery", ws -> { - ws.onConnect(ctx -> { - String id = ctx.sessionId(); - users.put(id, ctx); - broadcast("Discovery-Join", "Join"); - }); + ws.onConnect(ctx -> { + // ToDo + // A general notification + nodes.put(ctx.sessionId(), ctx); + }); - ws.onClose(ctx -> { - String id = ctx.sessionId(); - users.remove(id); - broadcast("Discovery-Leave", "Leave"); - }); + ws.onMessage(ctx -> { + String message = ctx.message(); + NodeInfo nodeInfo = gson.fromJson(message, NodeInfo.class); + registeredNodes.put(ctx.sessionId(), nodeInfo); + broadcastNodeCount(); + }); + + ws.onClose(ctx -> { + registeredNodes.remove(ctx.sessionId()); + broadcastNodeCount(); + }); }); } - private static void broadcast(String sender, String message) { - users.values().forEach(ctx -> ctx.send(users.size())); + private static void broadcastNodeCount() { + List nodeInfoList = new ArrayList<>(registeredNodes.values()); + String nodesJson = gson.toJson(nodeInfoList); + nodes.values().forEach(ctx -> ctx.send(nodesJson)); } + + public record NodeInfo(String hostname, int port) { } } diff --git a/SymphonyDiscovery/src/main/resources/log4j2.xml b/SymphonyDiscovery/src/main/resources/log4j2.xml index 44ca4f0..20f2b90 100644 --- a/SymphonyDiscovery/src/main/resources/log4j2.xml +++ b/SymphonyDiscovery/src/main/resources/log4j2.xml @@ -4,7 +4,7 @@ - %highlight{%d{yyyy-MM-dd HH:mm:ss} %-5level [%t]: %msg}{FATAL=red, ERROR=red, WARN=yellow, INFO=green, DEBUG=blue}%n + %d{yyyy-MM-dd HH:mm:ss} %highlight{%-5level}{FATAL=red, ERROR=red, WARN=yellow, INFO=green, DEBUG=blue}: %highlight{%msg}{FATAL=red, ERROR=red}%n diff --git a/SymphonyManager/src/main/resources/log4j2.xml b/SymphonyManager/src/main/resources/log4j2.xml index 75ee285..5d0b714 100644 --- a/SymphonyManager/src/main/resources/log4j2.xml +++ b/SymphonyManager/src/main/resources/log4j2.xml @@ -4,7 +4,7 @@ - %highlight{%d{yyyy-MM-dd HH:mm:ss} %-5level [%t]: %msg}{FATAL=red, ERROR=red, WARN=yellow, INFO=green, DEBUG=blue}%n + %d{yyyy-MM-dd HH:mm:ss} %highlight{%-5level}{FATAL=red, ERROR=red, WARN=yellow, INFO=green, DEBUG=blue}: %highlight{%msg}{FATAL=red, ERROR=red}%n diff --git a/SymphonyProducer/src/main/resources/log4j2.xml b/SymphonyProducer/src/main/resources/log4j2.xml index 75ee285..5d0b714 100644 --- a/SymphonyProducer/src/main/resources/log4j2.xml +++ b/SymphonyProducer/src/main/resources/log4j2.xml @@ -4,7 +4,7 @@ - %highlight{%d{yyyy-MM-dd HH:mm:ss} %-5level [%t]: %msg}{FATAL=red, ERROR=red, WARN=yellow, INFO=green, DEBUG=blue}%n + %d{yyyy-MM-dd HH:mm:ss} %highlight{%-5level}{FATAL=red, ERROR=red, WARN=yellow, INFO=green, DEBUG=blue}: %highlight{%msg}{FATAL=red, ERROR=red}%n diff --git a/SymphonySMTP/src/main/resources/log4j2.xml b/SymphonySMTP/src/main/resources/log4j2.xml index 75ee285..5d0b714 100644 --- a/SymphonySMTP/src/main/resources/log4j2.xml +++ b/SymphonySMTP/src/main/resources/log4j2.xml @@ -4,7 +4,7 @@ - %highlight{%d{yyyy-MM-dd HH:mm:ss} %-5level [%t]: %msg}{FATAL=red, ERROR=red, WARN=yellow, INFO=green, DEBUG=blue}%n + %d{yyyy-MM-dd HH:mm:ss} %highlight{%-5level}{FATAL=red, ERROR=red, WARN=yellow, INFO=green, DEBUG=blue}: %highlight{%msg}{FATAL=red, ERROR=red}%n diff --git a/docker-compose.yml b/docker-compose.yml index 39fdcc4..baec2a5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -52,6 +52,9 @@ services: - "8100:8100" networks: - symphony-network + environment: + - HOSTNAME=node1 + - PORT=8100 depends_on: - postgres_db - symphony-discovery @@ -65,6 +68,9 @@ services: - "8101:8101" networks: - symphony-network + environment: + - HOSTNAME=node2 + - PORT=8101 depends_on: - postgres_db - symphony-discovery @@ -78,6 +84,9 @@ services: - "8102:8102" networks: - symphony-network + environment: + - HOSTNAME=node3 + - PORT=8102 depends_on: - postgres_db - symphony-discovery @@ -91,6 +100,9 @@ services: - "8103:8103" networks: - symphony-network + environment: + - HOSTNAME=node4 + - PORT=8103 depends_on: - postgres_db - symphony-discovery @@ -104,6 +116,9 @@ services: - "8104:8104" networks: - symphony-network + environment: + - HOSTNAME=node5 + - PORT=8104 depends_on: - postgres_db - symphony-discovery