TelegramBot обрыв сессии при ответе юзеру
Есть один сайтец, куда я посылаю запрос и получаю JSON ответ, JSON парсю на события, далее некоторые из этих событий мне надо отправить юзеру отбратно.
Вот так я получаю JSON, обрабатываю его, парсю, нужные события в коллекцию и возвращаю:
public class EventsHandler {
public static List<EventToSend> getEvents() throws IOException {
URL url = null;
Scanner scanner = null;
StringBuilder sb = new StringBuilder();
List<EventToSend> eList = new ArrayList();
try {
url = new URL("https://www.ex.ru/rest/limit=all");
scanner = new Scanner((InputStream) url.getContent());
} catch (MalformedURLException e) {
e.printStackTrace();
}
while(scanner.hasNext()) {
sb.append(scanner.nextLine());
}
Gson gson = new Gson();
Response response = gson.fromJson(sb.toString(), Response.class);
for(int i =0; i < response.getEvents().size(); i++) {
EventToSend ets;
Event tmp = response.getEvents().get(i);
if(tmp.getHomePrice() > (Double)2.0 && tmp.getAwayPrice() > (Double)2.0) {
ets = new EventToSend();
ets.setDate(tmp.getDate());
ets.setEventName(tmp.getName());
ets.setLeagueName(tmp.getLeague().getName());
ets.setLeagueRegion(tmp.getLeague().getRegion());
ets.setSport(tmp.getLeague().getSport().getName());
ets.setOdds(tmp.getOdds());
eList.add(ets);
}
}
System.out.println("eList "+ eList.size());
return eList;
}
}
а вот так вот я пробую отослать юзеру на его запрос нужные события:
public class Bot extends TelegramLongPollingBot{
List<EventToSend> validEvents;
/**
* Метод для приема сообщений.
* @param update Содержит сообщение от пользователя.
*/
@Override
public void onUpdateReceived(Update update) {
Message message = update.getMessage();
if(message != null && message.hasText()) {
switch(message.getText()) {
case "/help":
sendMsg(message, "Помощь");
break;
case "/settings":
sendMsg(message, "Настройки");
break;
case "EVENTS":
try {
validEvents = EventsHandler.getEvents();
System.out.print("eSize: "+validEvents.size());
} catch (IOException e) {
e.printStackTrace();
}
if(validEvents.size() != 0)
for(int i=0; i < validEvents.size(); i++) {
sendMsg(message, validEvents.get(i).toString());
System.out.print(validEvents.get(i).toString());
}
else
sendMsg(message, "no events today :(");
break;
default:
sendMsg(message, "hello");
break;
}
}
}
public synchronized void sendMsg(Message message, String text) {
SendMessage sendMessage = new SendMessage();
sendMessage.enableMarkdown(true); //возможность разметки
sendMessage.setChatId(message.getChatId().toString()); //устанавливает id чата (кому отвечать)
sendMessage.setReplyToMessageId(message.getMessageId()); //устанавливает id сообщения (на какое сообщение отвечать)
sendMessage.setText(text);
try {
setButtons(sendMessage);
execute(sendMessage);
} catch (TelegramApiException e) {
e.printStackTrace();
}
}
public synchronized void setButtons(SendMessage sendMessage) {
ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup(); // Создаем клавиуатуру
sendMessage.setReplyMarkup(replyKeyboardMarkup); // Устанавливаем разметку для клавиатуры, связываем сообщение с клавой
replyKeyboardMarkup.setSelective(true); // Выводит клавиатуру определенным юзерам или всем
replyKeyboardMarkup.setResizeKeyboard(true); // Ресайз под количество кнопок
replyKeyboardMarkup.setOneTimeKeyboard(false); // Скрывать ли клаву после нажатия кнопки
List<KeyboardRow> keyboard = new ArrayList<>(); // Создаем список строк клавиатуры
KeyboardRow keyboardFirstRow = new KeyboardRow(); // Первая строчка клавиатуры
keyboardFirstRow.add(new KeyboardButton("/help")); // Добавляем кнопки в первую строчку клавиатуры
keyboardFirstRow.add(new KeyboardButton("/settings"));
KeyboardRow keyboardSecondRow = new KeyboardRow(); // Вторая строчка клавиатуры
keyboardSecondRow.add(new KeyboardButton("EVENTS")); // Добавляем кнопки во вторую строчку клавиатуры
keyboard.add(keyboardFirstRow);
keyboard.add(keyboardSecondRow);
replyKeyboardMarkup.setKeyboard(keyboard); // и устанваливаем этот список нашей клавиатуре
}
@Override
public String getBotUsername() {
return "ччч";
}
@Override
public String getBotToken() {
return "ччч";
}
}
Все встает на строке - validEvents = EventsHandler.getEvents() но почему?
Начал отлаживать: в момент, пока массив перебирает все ивенты, в какой то момент отладка перекидывает меня в класс public class DefaultBotSession implements BotSession, а в нем уже указывает на приватный класс:
private class HandlerThread extends Thread implements UpdatesHandler {
@Override
public void run() {
setPriority(Thread.MIN_PRIORITY);
while (running.get()) {
try {
List<Update> updates = getUpdateList();
if (updates.isEmpty()) {
synchronized (receivedUpdates) {
receivedUpdates.wait();
updates = getUpdateList();
if (updates.isEmpty()) {
continue;
}
}
}
callback.onUpdatesReceived(updates);
} catch (InterruptedException e) {
log.debug(e.getLocalizedMessage(), e);
interrupt();
} catch (Exception e) {
log.error(e.getLocalizedMessage(), e);
}
}
log.debug("Handler thread has being closed");
}
}
именно на строку receivedUpdates.wait();
кто сталкивался? не могу найти хотя бы примерного решения в инете. не понмиаю откуда ваще сессия берется если мы юзаем id юзера вместо сессии каждый запрос statles