Skip to content

Commit 9e95360

Browse files
authored
Configure Telegram API retries (#528)
1 parent b411ee0 commit 9e95360

3 files changed

Lines changed: 56 additions & 0 deletions

File tree

src/main/java/com/github/stickerifier/stickerify/bot/Stickerify.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.pengrad.telegrambot.TelegramBot;
2424
import com.pengrad.telegrambot.TelegramException;
2525
import com.pengrad.telegrambot.UpdatesListener;
26+
import com.pengrad.telegrambot.model.ResponseParameters;
2627
import com.pengrad.telegrambot.model.Update;
2728
import com.pengrad.telegrambot.model.request.ReplyParameters;
2829
import com.pengrad.telegrambot.model.request.richmessages.InputRichMessage;
@@ -33,12 +34,14 @@
3334
import com.pengrad.telegrambot.request.richmessages.SendRichMessage;
3435
import com.pengrad.telegrambot.request.richmessages.SendRichMessageDraft;
3536
import com.pengrad.telegrambot.response.BaseResponse;
37+
import org.jspecify.annotations.Nullable;
3638
import org.slf4j.event.Level;
3739

3840
import java.io.File;
3941
import java.io.IOException;
4042
import java.nio.file.Files;
4143
import java.nio.file.Path;
44+
import java.time.Duration;
4245
import java.util.List;
4346
import java.util.Set;
4447
import java.util.concurrent.Executor;
@@ -230,9 +233,31 @@ private <T extends BaseRequest<T, R>, R extends BaseResponse> R execute(BaseRequ
230233
return response;
231234
}
232235

236+
for (int retry = 1; retry <= 3 && isRetriable(response.parameters()); retry++) {
237+
var retryDelay = response.parameters().retryAfter();
238+
LOGGER.at(Level.WARN).log("The {} request failed: retrying in {} seconds", request.getMethod(), retryDelay);
239+
240+
try {
241+
Thread.sleep(Duration.ofSeconds(retryDelay));
242+
} catch (InterruptedException _) {
243+
Thread.currentThread().interrupt();
244+
break;
245+
}
246+
247+
response = bot.execute(request);
248+
249+
if (response.isOk()) {
250+
return response;
251+
}
252+
}
253+
233254
throw new TelegramApiException(request.getMethod(), response.description());
234255
}
235256

257+
private static boolean isRetriable(@Nullable ResponseParameters parameters) {
258+
return parameters != null && parameters.retryAfter() != null;
259+
}
260+
236261
private static void deleteTempFiles(Set<Path> pathsToDelete) {
237262
for (var path : pathsToDelete) {
238263
try {

src/test/java/com/github/stickerifier/stickerify/bot/MockResponses.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,17 @@ public final class MockResponses {
1313
}
1414
""").build();
1515

16+
static final MockResponse FAILURE_RESPONSE = new MockResponse.Builder().body("""
17+
{
18+
ok: false,
19+
error_code: 429,
20+
description: "Too Many Requests: retry after 3",
21+
parameters: {
22+
retry_after: 3
23+
}
24+
}
25+
""").build();
26+
1627
static final MockResponse START_MESSAGE = new MockResponse.Builder().body("""
1728
{
1829
ok: true,

src/test/java/com/github/stickerifier/stickerify/bot/StickerifyTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,4 +404,24 @@ void documentNotSupported() throws Exception {
404404
assertResponseContainsMarkdownMessage(sendRichMessage, Answer.ERROR);
405405
}
406406
}
407+
408+
@Test
409+
void retryApiCall() throws Exception {
410+
server.enqueue(MockResponses.HELP_MESSAGE);
411+
server.enqueue(MockResponses.FAILURE_RESPONSE);
412+
server.enqueue(MockResponses.SUCCESS_RESPONSE);
413+
414+
try (var _ = runBot()) {
415+
var getUpdates = server.takeRequest();
416+
assertEquals("/api/token/getUpdates", getUpdates.getTarget());
417+
418+
var firstSendRichMessage = server.takeRequest();
419+
assertEquals("/api/token/sendRichMessage", firstSendRichMessage.getTarget());
420+
421+
var secondSendRichMessage = server.takeRequest();
422+
assertEquals("/api/token/sendRichMessage", secondSendRichMessage.getTarget());
423+
424+
assertResponseContainsMarkdownMessage(secondSendRichMessage, Answer.HELP);
425+
}
426+
}
407427
}

0 commit comments

Comments
 (0)