Skip to content

Commit adfd89b

Browse files
authored
Fix stopping of service (#146)
1 parent 19ab3a1 commit adfd89b

File tree

3 files changed

+32
-11
lines changed

3 files changed

+32
-11
lines changed

api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestDispatcher.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class DiscordRequestDispatcher implements Runnable {
2323
private final HttpClient httpClient;
2424
private final BlockingQueue<DiscordRequestBuilder> queue;
2525
private final String botToken;
26-
private AtomicBoolean running = new AtomicBoolean(false);
26+
private final AtomicBoolean running = new AtomicBoolean(false);
2727
private int numberOfRequestsSent;
2828
private long timeSinceLastRequest;
2929

@@ -45,6 +45,8 @@ public DiscordResponseFuture queue(DiscordRequest discordRequest) {
4545
public void run() {
4646
running.set(true);
4747

48+
LOGGER.info("Request dispatcher has started");
49+
4850
while (running.get()) {
4951
long currentTime = System.currentTimeMillis();
5052
long elapsed = currentTime - timeSinceLastRequest;
@@ -64,6 +66,8 @@ public void run() {
6466
/* Ignore */
6567
}
6668
}
69+
70+
LOGGER.info("Request dispatcher has shutdown");
6771
}
6872

6973
public void stop() {

core/src/main/java/com/javadiscord/jdi/core/Discord.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -138,15 +138,15 @@ private void loadAnnotations() {
138138
}
139139

140140
public void start() {
141-
this.webSocketManager =
141+
webSocketManager =
142142
new WebSocketManager(
143143
new GatewaySetting().setApiVersion(10).setEncoding(GatewayEncoding.JSON),
144144
identifyRequest,
145145
cache
146146
);
147147

148148
WebSocketManagerProxy webSocketManagerProxy =
149-
new WebSocketManagerProxy(this.webSocketManager);
149+
new WebSocketManagerProxy(webSocketManager);
150150
ConnectionDetails connectionDetails =
151151
new ConnectionDetails(gateway.url(), botToken, gatewaySetting);
152152
ConnectionMediator connectionMediator =
@@ -159,13 +159,16 @@ public void start() {
159159
}
160160

161161
public void stop() {
162-
if (this.webSocketManager != null) {
163-
this.webSocketManager.stop();
162+
LOGGER.info("Shutdown initiated");
163+
164+
if (webSocketManager != null) {
165+
webSocketManager.stop();
164166
}
165167

166168
discordRequestDispatcher.stop();
167169

168170
EXECUTOR.shutdown();
171+
169172
try {
170173
if (!EXECUTOR.awaitTermination(30, TimeUnit.SECONDS)) {
171174
EXECUTOR.shutdownNow();
@@ -176,8 +179,8 @@ public void stop() {
176179
);
177180
}
178181
}
179-
} catch (InterruptedException ie) {
180-
LOGGER.error("Termination was interrupted within {} seconds.", 30);
182+
} catch (InterruptedException e) {
183+
LOGGER.error("Termination was interrupted within {} seconds", 30, e);
181184
Thread.currentThread().interrupt();
182185
}
183186
}

gateway/src/main/java/com/javadiscord/jdi/internal/gateway/WebSocketManager.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import io.vertx.core.Vertx;
99
import io.vertx.core.buffer.Buffer;
1010
import io.vertx.core.http.WebSocket;
11+
import io.vertx.core.http.WebSocketClient;
1112
import io.vertx.core.http.WebSocketConnectOptions;
1213
import io.vertx.core.http.WebSocketFrame;
1314
import org.apache.logging.log4j.LogManager;
@@ -21,6 +22,8 @@ public class WebSocketManager {
2122
private final WebSocketRetryHandler retryHandler;
2223
private final Cache cache;
2324
private WebSocket webSocket;
25+
private WebSocketClient webSocketClient;
26+
private boolean retryAllowed;
2427

2528
public WebSocketManager(
2629
GatewaySetting gatewaySetting, IdentifyRequest identifyRequest, Cache cache
@@ -48,8 +51,9 @@ public void start(ConnectionMediator connectionMediator) {
4851
)
4952
.setSsl(true);
5053

51-
vertx.createWebSocketClient()
52-
.connect(webSocketConnectOptions)
54+
webSocketClient = vertx.createWebSocketClient();
55+
retryAllowed = true;
56+
webSocketClient.connect(webSocketConnectOptions)
5357
.onSuccess(
5458
webSocket -> {
5559
LOGGER.info("Connected to Discord");
@@ -74,7 +78,9 @@ public void start(ConnectionMediator connectionMediator) {
7478
.onFailure(
7579
error -> {
7680
LOGGER.warn("Failed to connect to {} {}", gatewayURL, error.getCause());
77-
retryHandler.retry(() -> restart(connectionMediator));
81+
if (retryAllowed) {
82+
retryHandler.retry(() -> restart(connectionMediator));
83+
}
7884
}
7985
);
8086
}
@@ -86,14 +92,22 @@ private void frameHandler(WebSocketFrame frame, WebSocketHandler webSocketHandle
8692
}
8793

8894
public void restart(ConnectionMediator connectionMediator) {
95+
retryAllowed = true;
8996
stop();
9097
start(connectionMediator);
9198
}
9299

93100
public void stop() {
94-
if (!webSocket.isClosed()) {
101+
if (webSocket != null && !webSocket.isClosed()) {
95102
webSocket.close();
96103
}
104+
webSocketClient.close()
105+
.onSuccess(res -> LOGGER.info("Web socket client has been shutdown"))
106+
.onFailure(err -> LOGGER.error("Failed to shutdown web socket client", err));
107+
retryAllowed = false;
108+
vertx.close()
109+
.onSuccess(res -> LOGGER.info("Gateway has shutdown"))
110+
.onFailure(err -> LOGGER.error("Failed to shutdown gateway", err));
97111
}
98112

99113
public WebSocket getWebSocket() {

0 commit comments

Comments
 (0)