'how to prevent 429 to many requests while sending messages to telegram bot

i have an api which receives data from a source and send them to telegram bot.

i receive data in bulk from my source and will send them to telegram bot with that rate but telegram can handle only 1 message per sec so eventually it returning this exception

java.io.IOException: Server returned HTTP response code: 429 for URL:....

is there a way to store messages in list and iterate this list from a thread

am trying to learn java so please don't mind if my code not good.

Sample.java

class Sample{
    run(){
        while(true){
            //some operations
            SendMessage.getInstance().sendToTelegram(clientCommand);
            //
        }
    }
}

SendMessage.java

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

public class SendMessage {
        static SendMessage getInstance() {
                return instance;
        }
    public void sendToTelegram(String message) {
        String urlString = "https://api.telegram.org/;
        String apiToken = obj.getInstance().getTelegramToken();
        String chatId = obj.getInstance().getChatId();
        String text = message;
        urlString = urlString+"/bot"+apiToken+"/sendMessage?parse_mode=HTML&chat_id="+chatId+"&text="+msgToSend;


        try {
            URL url = new URL(urlString);
            URLConnection conn = url.openConnection();
            InputStream is = new BufferedInputStream(conn.getInputStream());
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                String inputLine = "";
                StringBuilder sb = new StringBuilder();
                while ((inputLine = br.readLine()) != null) {
                    sb.append(inputLine);
                    sb.append('\r');
                }
                br.close();
        } catch (IOException e) {
            log.error(e);
        }
    }
}

if thread concept works can anyone please help me how to add into a list and send them to telegram bot without loosing data

by using sleeping thread am not getting 429 too many responses exception

class Sample{
    run(){
        while(true){
            //some operations
            SendMessage.getInstance().sendToTelegram(clientCommand);
            Thread.sleep(2000);
        }
    }
}

but getting new exceptions bad request

java.io.IOException: Server returned HTTP response code: 400 for URL

and this is the demo telegram url

https://api.telegram.org/botid:TELEGRAM_TOKEN/sendMessage?parse_mode=HTML&chat_id=CHAT_ID&text=<b>Alert</b>%0A<b>Alert Name:</b> "REGISTER Violation"%0A<b>Severity:</b> "Medium"%0A<b>TimeStamp:</b> "2022-05-10 22:17:34.31"%0A<b>Event ID:</b> "160"%0A<b>Event Message:</b> "An unregistered User has been detected. This can be a Caller-ID poisoning or Number Harvesting attack. Only a valid registered user can make or receive calls"%0A<b>Source Contact:</b> "192.168.3.31:5077"%0A<b>Destination Contact:</b> "192.168.10.10:5555"%0A<b>Source IP:</b> "192.168.3.31"%0A<b>Destination IP:</b> "192.168.10.10"%0A<b>Source Ext:</b> "4545454545"%0A<b>Destination Ext:</b> "%2B43965272"%0A<b>Source Domain:</b> "n/a"%0A<b>Destination Domain:</b> "n/a"%0A<b>Protocol:</b> "SIP"%0A<b>Comment:</b> "None"%0A<b>Attack Name:</b> "REGISTER Violation"%0A<b>Method:</b> "INVITE"%0A<b>Source Country:</b> "Unknown"%0A<b>Destination Country:</b> "AUSTRIA"%0A<b>CallType:</b> "International"%0A<b>RiskScore:</b> "0"%0A<b>Client Name:</b> "Unknown:Unknown"%0A<b>Network Group Name:</b> "defaultNonVlanGroup"%0A<b>Acknowledged:</b> "No"%0A<b>Alert Category:</b> "External"%0A<b>UCTM Name:</b> "redshift" 

and i tried manually by pasting url which shown in exception but its worked fine but in application its throwing this exception

Please help where i am doing wrong



Solution 1:[1]

You could just do a simple Thread.sleep(2000) in your loop. Might not scale too good

Or you could store all your messages in a synchronzied list (https://www.techiedelight.com/queue-implementation-in-java/) and make a scheduler that would read a message every x seconds, send it and delete it from the list. If your using Spring Boot this is pretty easy -> https://www.baeldung.com/spring-task-scheduler

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Tommy