From 767965551fe42f4cb069fb69766eb4dea65b33e6 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 d4e1dae72a03b64c0b8b4e3303e6ef6b1ca660bf 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 a8db0fb42c86c4b23881fe67b8eaa0c11301efbe 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 5396ce5c74169ffbaa08313342c87a5cfe1b981c 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 94687ff7a0a8cbdeb39d108fa764f82a42a28660 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 5089733de22c5a66852c6412acaf75ecdb6dd20d 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 3dc048b7..2903d15c 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,6 +22,7 @@ public class DiscordRequestDispatcher implements Runnable { private final HttpClient httpClient; private final BlockingQueue queue; private final String botToken; + private boolean appIsActive; private int numberOfRequestsSent; private long timeSinceLastRequest; @@ -31,6 +32,7 @@ public DiscordRequestDispatcher(String botToken) { this.queue = new LinkedBlockingQueue<>(); this.numberOfRequestsSent = 0; this.timeSinceLastRequest = 0; + this.appIsActive = true; } public DiscordResponseFuture queue(DiscordRequest discordRequest) { @@ -41,7 +43,8 @@ public DiscordResponseFuture queue(DiscordRequest discordRequest) { @Override public void run() { - while (true) { + + while (appIsActive) { long currentTime = System.currentTimeMillis(); long elapsed = currentTime - timeSinceLastRequest; @@ -122,4 +125,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 639772f9b18ef512f90ad48b266678ef60c24ac7 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 2903d15c..b6d05bb6 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 { @@ -22,7 +23,7 @@ public class DiscordRequestDispatcher implements Runnable { private final HttpClient httpClient; private final BlockingQueue queue; private final String botToken; - private boolean appIsActive; + private AtomicBoolean running; private int numberOfRequestsSent; private long timeSinceLastRequest; @@ -32,7 +33,6 @@ public DiscordRequestDispatcher(String botToken) { this.queue = new LinkedBlockingQueue<>(); this.numberOfRequestsSent = 0; this.timeSinceLastRequest = 0; - this.appIsActive = true; } public DiscordResponseFuture queue(DiscordRequest discordRequest) { @@ -43,8 +43,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; @@ -65,6 +66,11 @@ public void run() { } } + public void stop() { + running.set(false); + // TODO implementation of stop method, handling queue + } + private void sendRequest(DiscordRequestBuilder discordRequestBuilder) { try { HttpRequest.Builder requestBuilder = @@ -125,8 +131,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 634f3a112955966be1c2a4a23cb166658b130d31 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 8cb85894be7e53219cd1e1d084d4b8bc716f4128 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 b6d05bb6..b85ef978 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 @@ -23,7 +23,7 @@ public class DiscordRequestDispatcher implements Runnable { private final HttpClient httpClient; 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 8d0b5f6b2c9e57de19e48ca2019b95c821eb7b3c 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 7d78b8de34b7efb32086547561279b792d4ea78b 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 b85ef978..f9a67027 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 @@ -43,7 +43,7 @@ public DiscordResponseFuture queue(DiscordRequest discordRequest) { @Override public void run() { - running = new AtomicBoolean(true); + running.set(true); while (running.get()) { long currentTime = System.currentTimeMillis(); @@ -68,7 +68,6 @@ public void run() { public void stop() { running.set(false); - // TODO implementation of stop method, handling queue } private void sendRequest(DiscordRequestBuilder discordRequestBuilder) { From 8005d654eee9fc8feb8ee2bd8a02f90a97d84a8c 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"); }