ScheduledThreadPoolExecutor в Telegram-бот Java - PullRequest
0 голосов
/ 03 марта 2019

Я новичок в Java и пытаюсь создать бот Telegram , который собирает данные от пользователей.Процесс заключается в том, что пользователь отправляет текст и для проверки себя он должен отправить картинку после этого.если он отправит no pic , процесс не будет завершен. но данные будут сохранены в моем классе .я использовал ScheduledThreadPoolExecutor, чтобы проверить через 5 минут, хранится ли что-то в переменной или нет, если это правда, и бот не получил рис, удаляет сохраненные данные.но это не сработало.Поскольку он проверяет переменную на регулярной основе 5 минут, я хочу, чтобы он проверял переменную с момента, когда пользователь отправил свой текст (данные хранятся в переменной).Кто-нибудь может предложить лучший способ или решение для решения этой проблемы?

мой код выглядит следующим образом:

Основной класс:

public class MainClass {



        public static void main(String[] args) {
            ApiContextInitializer.init();
            TelegramBotsApi telegramBotsApi = new TelegramBotsApi();

            try {
                telegramBotsApi.registerBot(new StudiumBot());

            } catch (TelegramApiException e) {
                e.printStackTrace();
            }
        }


}

Класс бота:

    public class XXXBot extends TelegramLongPollingBot {


        public static String answer = null;
        public static boolean photo_sent= false;


        public void onUpdateReceived(Update update) {



           if (update.hasPhoto()) {


                photo_sent= true;

            }

         if (update.hasMessage() && update.getMessage().getText().contains("XXXX")) {

                answer=update.getMessage().getText();

                ThreadPool.poolExecutor();

            }


        }
    }

ThreadPool Class:

    public class ThreadPool {
        public static void poolExecutor() {
            ScheduledThreadPoolExecutor stpe = new ScheduledThreadPoolExecutor(1);
            stpe.scheduleAtFixedRate(new VariableRemover(), 0, 10, TimeUnit.MINUTES);
        }
    }

Класс, который удаляет сохраненные данные:

public class VariableRemover implements Runnable {

    public void run(){
        if(! XXXBot.photo_sent){
           XXXBot.answer= null;
        }

    }

}

1 Ответ

0 голосов
/ 03 марта 2019

Один из способов добиться этого - сохранить временную метку в классе XXXBot.

public class XXXBot extends TelegramLongPollingBot{
    ....
    public static long timeWhenThisObjectWasBuilt = System.currentTimeMillis();
}

А затем в классе VariableRemover проверить, следует ли удалять объект на основе проверки времени:

public class VariableRemover implements Runnable {
   private long expiryTime = 10*60*1000; // convert minutes to millis
   public void run(){
       if(! photo_sent && System.currentTimeMillis() > (timeWhenThisObjectWasBuilt + expiryTime)){
          answer= null;
       }

   }

}

Примечание. В одном файле не может быть двух открытых классов высшего уровня.

...