Skip to content

Commit e61be1d

Browse files
committed
Busy-wait fix
1 parent 47f0ca3 commit e61be1d

File tree

1 file changed

+16
-21
lines changed

1 file changed

+16
-21
lines changed

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

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.Map;
99
import java.util.concurrent.BlockingQueue;
1010
import java.util.concurrent.LinkedBlockingQueue;
11+
import java.util.concurrent.TimeUnit;
1112
import java.util.concurrent.atomic.AtomicBoolean;
1213
import java.util.stream.Stream;
1314

@@ -25,11 +26,11 @@ public class DiscordRequestDispatcher implements Runnable {
2526
private final BlockingQueue<DiscordRequestBuilder> queue;
2627
private final String botToken;
2728
private final AtomicBoolean running = new AtomicBoolean(false);
29+
private final RateLimit rateLimit = new RateLimit();
30+
2831
private int numberOfRequestsSent;
2932
private long timeSinceLastRequest;
3033

31-
private RateLimit rateLimit = new RateLimit();
32-
3334
public DiscordRequestDispatcher(String botToken) {
3435
this.botToken = botToken;
3536
this.httpClient = HttpClient.newBuilder().build();
@@ -51,30 +52,24 @@ public void run() {
5152
LOGGER.info("Request dispatcher has started");
5253

5354
while (running.get()) {
54-
long currentTime = System.currentTimeMillis();
55-
long elapsed = currentTime - timeSinceLastRequest;
56-
57-
if (rateLimit.getRemaining() == 0 && elapsed < rateLimit.getResetAfter()) {
58-
try {
59-
Thread.sleep(rateLimit.getResetAfter() - elapsed);
60-
} catch (InterruptedException e) {
61-
/* Ignore */
55+
try {
56+
long currentTime = System.currentTimeMillis();
57+
long elapsed = currentTime - timeSinceLastRequest;
58+
59+
if (rateLimit.getRemaining() == 0 && elapsed < rateLimit.getResetAfter()) {
60+
TimeUnit.MILLISECONDS.sleep(rateLimit.getResetAfter() - elapsed);
61+
6262
}
63-
}
6463

65-
if (elapsed < 1000 && numberOfRequestsSent >= 50) {
66-
try {
67-
Thread.sleep(1000 - elapsed);
68-
} catch (InterruptedException e) {
69-
/* Ignore */
64+
if (elapsed < 1000 && numberOfRequestsSent >= 50) {
65+
TimeUnit.MILLISECONDS.sleep(1000 - elapsed);
66+
numberOfRequestsSent = 0;
7067
}
71-
numberOfRequestsSent = 0;
72-
}
7368

74-
try {
7569
sendRequest(queue.take());
7670
} catch (InterruptedException e) {
77-
/* Ignore */
71+
LOGGER.warn("Request dispatcher has interrupted");
72+
Thread.currentThread().interrupt();
7873
}
7974
}
8075

@@ -131,7 +126,7 @@ private void sendRequest(DiscordRequestBuilder discordRequestBuilder) {
131126
httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
132127

133128
HttpHeaders headers = response.headers();
134-
headers.firstValue("x-ratelimit-bucket").ifPresent(val -> rateLimit.setBucket(val));
129+
headers.firstValue("x-ratelimit-bucket").ifPresent(rateLimit::setBucket);
135130
headers.firstValue("x-ratelimit-limit")
136131
.ifPresent(val -> rateLimit.setLimit(Integer.parseInt(val)));
137132
headers.firstValue("x-ratelimit-remaining")

0 commit comments

Comments
 (0)