Я новичок в Java и пытаюсь создать бота Телеграмма, который собирает данные от пользователей.
Процесс заключается в том, что пользователь отправляет текст, а для подтверждения себя он должен после этого отправить изображение. если он отправит нет фото, процесс не будет завершен. но данные будут сохранены в моем классе.
я использовал 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:
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;
}
}
}




Один из способов добиться этого — поддерживать метку времени в классе 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;
}
}
}
Примечание. В одном файле не может быть двух общедоступных классов верхнего уровня.