From 4d9dda784af06a4f74b01c09a6ff60e07387a0b0 Mon Sep 17 00:00:00 2001 From: Fabio Menna Date: Sat, 18 May 2024 00:31:53 +0200 Subject: [PATCH 01/12] feat: adding stop() method to interrupt and close all pools and connection sockets --- .../com/javadiscord/jdi/core/Discord.java | 35 +++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/com/javadiscord/jdi/core/Discord.java b/core/src/main/java/com/javadiscord/jdi/core/Discord.java index 6c774c35..80b4d9e7 100644 --- a/core/src/main/java/com/javadiscord/jdi/core/Discord.java +++ b/core/src/main/java/com/javadiscord/jdi/core/Discord.java @@ -8,7 +8,6 @@ import com.javadiscord.jdi.internal.cache.CacheType; import com.javadiscord.jdi.internal.gateway.*; import com.javadiscord.jdi.internal.gateway.identify.IdentifyRequest; - import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -24,6 +23,8 @@ import java.util.List; import java.util.concurrent.Executor; import java.util.concurrent.Executors; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; public class Discord { private static final Logger LOGGER = LogManager.getLogger(); @@ -45,6 +46,7 @@ public class Discord { private final List annotatedEventListeners = new ArrayList<>(); private final List eventListeners = new ArrayList<>(); + private WebSocketManager webSocketManager; private Object listenerLoader; public Discord(String botToken) { @@ -126,21 +128,21 @@ private void loadAnnotations() { } } } catch (ClassNotFoundException - | InstantiationException - | IllegalAccessException - | InvocationTargetException ignore) { + | InstantiationException + | IllegalAccessException + | InvocationTargetException ignore) { /* Ignore */ } } public void start() { - WebSocketManager webSocketManager = + this.webSocketManager = new WebSocketManager( new GatewaySetting().setApiVersion(10).setEncoding(GatewayEncoding.JSON), identifyRequest, cache); - WebSocketManagerProxy webSocketManagerProxy = new WebSocketManagerProxy(webSocketManager); + WebSocketManagerProxy webSocketManagerProxy = new WebSocketManagerProxy(this.webSocketManager); ConnectionDetails connectionDetails = new ConnectionDetails(gateway.url(), botToken, gatewaySetting); ConnectionMediator connectionMediator = @@ -152,6 +154,27 @@ public void start() { EXECUTOR.execute(discordRequestDispatcher); } + public void stop() { + if (this.webSocketManager != null) { + this.webSocketManager.stop(); + } + + ThreadPoolExecutor threadPool = (ThreadPoolExecutor) EXECUTOR; + if (threadPool.getPoolSize() > 0) threadPool.shutdown(); + + try { + if (!threadPool.awaitTermination(30, TimeUnit.SECONDS)) { + threadPool.shutdownNow(); + if (!threadPool.awaitTermination(30, TimeUnit.SECONDS)) { + LOGGER.error("Threads not terminated properly"); + } + } + } catch (InterruptedException ie) { + threadPool.shutdownNow(); + Thread.currentThread().interrupt(); + } + } + public void startWithoutGatewayEvents() { EXECUTOR.execute(discordRequestDispatcher); } From bd12c5f37351eb9ab5cd7b2d8308a07a52262155 Mon Sep 17 00:00:00 2001 From: Fabio Menna Date: Sun, 19 May 2024 12:10:05 +0200 Subject: [PATCH 02/12] build: spotless changes --- .../main/java/com/javadiscord/jdi/core/Discord.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/com/javadiscord/jdi/core/Discord.java b/core/src/main/java/com/javadiscord/jdi/core/Discord.java index 80b4d9e7..1cd60b41 100644 --- a/core/src/main/java/com/javadiscord/jdi/core/Discord.java +++ b/core/src/main/java/com/javadiscord/jdi/core/Discord.java @@ -8,6 +8,7 @@ import com.javadiscord.jdi.internal.cache.CacheType; import com.javadiscord.jdi.internal.gateway.*; import com.javadiscord.jdi.internal.gateway.identify.IdentifyRequest; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -128,9 +129,9 @@ private void loadAnnotations() { } } } catch (ClassNotFoundException - | InstantiationException - | IllegalAccessException - | InvocationTargetException ignore) { + | InstantiationException + | IllegalAccessException + | InvocationTargetException ignore) { /* Ignore */ } } @@ -142,7 +143,8 @@ public void start() { identifyRequest, cache); - WebSocketManagerProxy webSocketManagerProxy = new WebSocketManagerProxy(this.webSocketManager); + WebSocketManagerProxy webSocketManagerProxy = + new WebSocketManagerProxy(this.webSocketManager); ConnectionDetails connectionDetails = new ConnectionDetails(gateway.url(), botToken, gatewaySetting); ConnectionMediator connectionMediator = From e9264f36468ab2126b3776b575092cd5a0ba2d4c Mon Sep 17 00:00:00 2001 From: Fabio Menna Date: Mon, 20 May 2024 00:32:53 +0200 Subject: [PATCH 03/12] refactor: adjusting type of EXECUTOR --- .../java/com/javadiscord/jdi/core/Discord.java | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/com/javadiscord/jdi/core/Discord.java b/core/src/main/java/com/javadiscord/jdi/core/Discord.java index 1cd60b41..2b100988 100644 --- a/core/src/main/java/com/javadiscord/jdi/core/Discord.java +++ b/core/src/main/java/com/javadiscord/jdi/core/Discord.java @@ -22,14 +22,13 @@ import java.net.http.HttpResponse; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class Discord { private static final Logger LOGGER = LogManager.getLogger(); - private static final Executor EXECUTOR = Executors.newCachedThreadPool(); + private static final ExecutorService EXECUTOR = Executors.newCachedThreadPool(); private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); private static final String WEBSITE = "https://javadiscord.com/"; @@ -161,18 +160,16 @@ public void stop() { this.webSocketManager.stop(); } - ThreadPoolExecutor threadPool = (ThreadPoolExecutor) EXECUTOR; - if (threadPool.getPoolSize() > 0) threadPool.shutdown(); - + EXECUTOR.shutdown(); try { - if (!threadPool.awaitTermination(30, TimeUnit.SECONDS)) { - threadPool.shutdownNow(); - if (!threadPool.awaitTermination(30, TimeUnit.SECONDS)) { + if (!EXECUTOR.awaitTermination(30, TimeUnit.SECONDS)) { + EXECUTOR.shutdownNow(); + if (!EXECUTOR.awaitTermination(30, TimeUnit.SECONDS)) { LOGGER.error("Threads not terminated properly"); } } } catch (InterruptedException ie) { - threadPool.shutdownNow(); + EXECUTOR.shutdownNow(); Thread.currentThread().interrupt(); } } From 8fb4750409fb9b008f47dbb2b1582f89c0befef1 Mon Sep 17 00:00:00 2001 From: Fabio Menna Date: Mon, 20 May 2024 00:47:34 +0200 Subject: [PATCH 04/12] feat(logger): adding log to stop() method --- core/src/main/java/com/javadiscord/jdi/core/Discord.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/main/java/com/javadiscord/jdi/core/Discord.java b/core/src/main/java/com/javadiscord/jdi/core/Discord.java index 2b100988..83108897 100644 --- a/core/src/main/java/com/javadiscord/jdi/core/Discord.java +++ b/core/src/main/java/com/javadiscord/jdi/core/Discord.java @@ -169,6 +169,8 @@ public void stop() { } } } catch (InterruptedException ie) { + LOGGER.error("Termination was interrupted within {} seconds." + + "Trying to re-cancel thread.", 30); EXECUTOR.shutdownNow(); Thread.currentThread().interrupt(); } From 7700b22915d2d10f498ef211f69f9643867ab1df Mon Sep 17 00:00:00 2001 From: Fabio Menna Date: Mon, 20 May 2024 01:17:02 +0200 Subject: [PATCH 05/12] refactor(spotless): apply formatting --- core/src/main/java/com/javadiscord/jdi/core/Discord.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/javadiscord/jdi/core/Discord.java b/core/src/main/java/com/javadiscord/jdi/core/Discord.java index 83108897..c8fa8506 100644 --- a/core/src/main/java/com/javadiscord/jdi/core/Discord.java +++ b/core/src/main/java/com/javadiscord/jdi/core/Discord.java @@ -169,8 +169,9 @@ public void stop() { } } } catch (InterruptedException ie) { - LOGGER.error("Termination was interrupted within {} seconds." + - "Trying to re-cancel thread.", 30); + LOGGER.error( + "Termination was interrupted within {} seconds. Trying to re-cancel thread.", + 30); EXECUTOR.shutdownNow(); Thread.currentThread().interrupt(); } From b0edfa9addc65932caeb8da5846fbcf556396cc7 Mon Sep 17 00:00:00 2001 From: Fabio Menna Date: Mon, 20 May 2024 15:33:51 +0200 Subject: [PATCH 06/12] feat: introducing new boolean which checks if appIsActive or not. --- .../jdi/internal/api/DiscordRequestDispatcher.java | 9 ++++++++- core/src/main/java/com/javadiscord/jdi/core/Discord.java | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestDispatcher.java b/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestDispatcher.java index ff714f1a..c59ad87d 100644 --- a/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestDispatcher.java +++ b/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestDispatcher.java @@ -21,6 +21,7 @@ public class DiscordRequestDispatcher implements Runnable { private static final Logger LOGGER = LogManager.getLogger(); private final BlockingQueue queue; private final String botToken; + private boolean appIsActive; private int numberOfRequestsSent; private long timeSinceLastRequest; @@ -29,6 +30,7 @@ public DiscordRequestDispatcher(String botToken) { this.queue = new LinkedBlockingQueue<>(); this.numberOfRequestsSent = 0; this.timeSinceLastRequest = 0; + this.appIsActive = true; } public DiscordResponseFuture queue(DiscordRequest discordRequest) { @@ -39,7 +41,8 @@ public DiscordResponseFuture queue(DiscordRequest discordRequest) { @Override public void run() { - while (true) { + + while (appIsActive) { long currentTime = System.currentTimeMillis(); long elapsed = currentTime - timeSinceLastRequest; @@ -128,4 +131,8 @@ private static String[] headerMapToStringArr(Map headers) { .toList() .toArray(new String[0]); } + + public void setAppIsActive(boolean appIsActive) { + this.appIsActive = appIsActive; + } } diff --git a/core/src/main/java/com/javadiscord/jdi/core/Discord.java b/core/src/main/java/com/javadiscord/jdi/core/Discord.java index c8fa8506..ef4f18a2 100644 --- a/core/src/main/java/com/javadiscord/jdi/core/Discord.java +++ b/core/src/main/java/com/javadiscord/jdi/core/Discord.java @@ -175,6 +175,8 @@ public void stop() { EXECUTOR.shutdownNow(); Thread.currentThread().interrupt(); } + + discordRequestDispatcher.setAppIsActive(false); } public void startWithoutGatewayEvents() { From 812698a33a97d6d76f5dd512d0404bd2814b9234 Mon Sep 17 00:00:00 2001 From: Fabio Menna Date: Mon, 20 May 2024 16:33:27 +0200 Subject: [PATCH 07/12] feat(wip): introducing AtomicBoolean for thread-safety. Adjusting stop method for DiscordRequestDispatcher.java --- .../internal/api/DiscordRequestDispatcher.java | 16 +++++++++------- .../java/com/javadiscord/jdi/core/Discord.java | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestDispatcher.java b/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestDispatcher.java index c59ad87d..88f59b5d 100644 --- a/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestDispatcher.java +++ b/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestDispatcher.java @@ -10,6 +10,7 @@ import java.util.Map; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Stream; public class DiscordRequestDispatcher implements Runnable { @@ -21,7 +22,7 @@ public class DiscordRequestDispatcher implements Runnable { private static final Logger LOGGER = LogManager.getLogger(); private final BlockingQueue queue; private final String botToken; - private boolean appIsActive; + private AtomicBoolean running; private int numberOfRequestsSent; private long timeSinceLastRequest; @@ -30,7 +31,6 @@ public DiscordRequestDispatcher(String botToken) { this.queue = new LinkedBlockingQueue<>(); this.numberOfRequestsSent = 0; this.timeSinceLastRequest = 0; - this.appIsActive = true; } public DiscordResponseFuture queue(DiscordRequest discordRequest) { @@ -41,8 +41,9 @@ public DiscordResponseFuture queue(DiscordRequest discordRequest) { @Override public void run() { + running = new AtomicBoolean(true); - while (appIsActive) { + while (running.get()) { long currentTime = System.currentTimeMillis(); long elapsed = currentTime - timeSinceLastRequest; @@ -63,6 +64,11 @@ public void run() { } } + public void stop() { + running.set(false); + // TODO implementation of stop method, handling queue + } + private void sendRequest(DiscordRequestBuilder discordRequestBuilder) { try (HttpClient httpClient = HttpClient.newBuilder().build()) { HttpRequest.Builder requestBuilder = @@ -131,8 +137,4 @@ private static String[] headerMapToStringArr(Map headers) { .toList() .toArray(new String[0]); } - - public void setAppIsActive(boolean appIsActive) { - this.appIsActive = appIsActive; - } } diff --git a/core/src/main/java/com/javadiscord/jdi/core/Discord.java b/core/src/main/java/com/javadiscord/jdi/core/Discord.java index ef4f18a2..6b7b330b 100644 --- a/core/src/main/java/com/javadiscord/jdi/core/Discord.java +++ b/core/src/main/java/com/javadiscord/jdi/core/Discord.java @@ -176,7 +176,7 @@ public void stop() { Thread.currentThread().interrupt(); } - discordRequestDispatcher.setAppIsActive(false); + discordRequestDispatcher.stop(); } public void startWithoutGatewayEvents() { From 92e54e403d7afdced0b0a6fc90eeb649cca6bd1e Mon Sep 17 00:00:00 2001 From: Fabio Menna Date: Mon, 20 May 2024 16:35:48 +0200 Subject: [PATCH 08/12] fix: adjusting catch, removing additional shutdown of threadpool. --- core/src/main/java/com/javadiscord/jdi/core/Discord.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/java/com/javadiscord/jdi/core/Discord.java b/core/src/main/java/com/javadiscord/jdi/core/Discord.java index 6b7b330b..f633e942 100644 --- a/core/src/main/java/com/javadiscord/jdi/core/Discord.java +++ b/core/src/main/java/com/javadiscord/jdi/core/Discord.java @@ -172,7 +172,6 @@ public void stop() { LOGGER.error( "Termination was interrupted within {} seconds. Trying to re-cancel thread.", 30); - EXECUTOR.shutdownNow(); Thread.currentThread().interrupt(); } From f3d0c8acf45638c5ba1a97146f4d6807989a51fc Mon Sep 17 00:00:00 2001 From: Fabio Menna Date: Mon, 20 May 2024 16:41:07 +0200 Subject: [PATCH 09/12] fix: AtomicBoolean and dispatcher stop in method as commented --- .../jdi/internal/api/DiscordRequestDispatcher.java | 2 +- core/src/main/java/com/javadiscord/jdi/core/Discord.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestDispatcher.java b/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestDispatcher.java index 88f59b5d..d8d4c43c 100644 --- a/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestDispatcher.java +++ b/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestDispatcher.java @@ -22,7 +22,7 @@ public class DiscordRequestDispatcher implements Runnable { private static final Logger LOGGER = LogManager.getLogger(); private final BlockingQueue queue; private final String botToken; - private AtomicBoolean running; + private AtomicBoolean running = new AtomicBoolean(false); private int numberOfRequestsSent; private long timeSinceLastRequest; diff --git a/core/src/main/java/com/javadiscord/jdi/core/Discord.java b/core/src/main/java/com/javadiscord/jdi/core/Discord.java index f633e942..161c9f73 100644 --- a/core/src/main/java/com/javadiscord/jdi/core/Discord.java +++ b/core/src/main/java/com/javadiscord/jdi/core/Discord.java @@ -160,6 +160,8 @@ public void stop() { this.webSocketManager.stop(); } + discordRequestDispatcher.stop(); + EXECUTOR.shutdown(); try { if (!EXECUTOR.awaitTermination(30, TimeUnit.SECONDS)) { @@ -174,8 +176,6 @@ public void stop() { 30); Thread.currentThread().interrupt(); } - - discordRequestDispatcher.stop(); } public void startWithoutGatewayEvents() { From 2ed40908ecf749db7aeacb8b514c6819e74e42d3 Mon Sep 17 00:00:00 2001 From: Fabio Menna Date: Mon, 20 May 2024 16:50:27 +0200 Subject: [PATCH 10/12] feat: adjusting log --- core/src/main/java/com/javadiscord/jdi/core/Discord.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/com/javadiscord/jdi/core/Discord.java b/core/src/main/java/com/javadiscord/jdi/core/Discord.java index 161c9f73..2a205bef 100644 --- a/core/src/main/java/com/javadiscord/jdi/core/Discord.java +++ b/core/src/main/java/com/javadiscord/jdi/core/Discord.java @@ -167,13 +167,13 @@ public void stop() { if (!EXECUTOR.awaitTermination(30, TimeUnit.SECONDS)) { EXECUTOR.shutdownNow(); if (!EXECUTOR.awaitTermination(30, TimeUnit.SECONDS)) { - LOGGER.error("Threads not terminated properly"); + LOGGER.error( + "Executor failed to shutdown within the specified time limit, some" + + " tasks may still be running"); } } } catch (InterruptedException ie) { - LOGGER.error( - "Termination was interrupted within {} seconds. Trying to re-cancel thread.", - 30); + LOGGER.error("Termination was interrupted within {} seconds.", 30); Thread.currentThread().interrupt(); } } From 0bfefa214f5421141c7101181d009dab7c75b159 Mon Sep 17 00:00:00 2001 From: Fabio Menna Date: Mon, 20 May 2024 16:51:21 +0200 Subject: [PATCH 11/12] feat: adjusting bool, removing todo --- .../javadiscord/jdi/internal/api/DiscordRequestDispatcher.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestDispatcher.java b/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestDispatcher.java index d8d4c43c..d24586a2 100644 --- a/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestDispatcher.java +++ b/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestDispatcher.java @@ -41,7 +41,7 @@ public DiscordResponseFuture queue(DiscordRequest discordRequest) { @Override public void run() { - running = new AtomicBoolean(true); + running.set(true); while (running.get()) { long currentTime = System.currentTimeMillis(); @@ -66,7 +66,6 @@ public void run() { public void stop() { running.set(false); - // TODO implementation of stop method, handling queue } private void sendRequest(DiscordRequestBuilder discordRequestBuilder) { From c02140752bc0e3181b4a6cfe67e5f1d63d4bd393 Mon Sep 17 00:00:00 2001 From: Fabio Menna Date: Mon, 20 May 2024 16:52:01 +0200 Subject: [PATCH 12/12] feat: adjusting log level --- core/src/main/java/com/javadiscord/jdi/core/Discord.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/javadiscord/jdi/core/Discord.java b/core/src/main/java/com/javadiscord/jdi/core/Discord.java index 2a205bef..f8f5d734 100644 --- a/core/src/main/java/com/javadiscord/jdi/core/Discord.java +++ b/core/src/main/java/com/javadiscord/jdi/core/Discord.java @@ -167,7 +167,7 @@ public void stop() { if (!EXECUTOR.awaitTermination(30, TimeUnit.SECONDS)) { EXECUTOR.shutdownNow(); if (!EXECUTOR.awaitTermination(30, TimeUnit.SECONDS)) { - LOGGER.error( + LOGGER.warn( "Executor failed to shutdown within the specified time limit, some" + " tasks may still be running"); }