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


Ответы (0 шт):