telegram bot на java, отправка сообщений по расписанию

Пишу бота, используя библиотеку:

<groupId>org.telegram</groupId>
<artifactId>telegrambots</artifactId>
<version>6.1.0</version>

Хочу отправлять себе сообщения по расписанию, к примеру каждый час, для этого пользуюсь ScheduledExecutorService, в итоге получил такую структуру (код сильно урезан, но картину передать должен):

Класс Main:

public class Main {
    public static void main(String[] args) {
        App bot = new App();
        TelegramBotsApi telegramBotsApi;
        try {
            telegramBotsApi = new TelegramBotsApi(DefaultBotSession.class);
            telegramBotsApi.registerBot(bot);
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }

        ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
        scheduler.scheduleAtFixedRate(new ParsingExchange(), 0, 1, TimeUnit.HOURS);
    }

    @Override
    public void onUpdateReceived(Update update) {
         execute(sendMessageController.createMessage(update, "Текст"));
    }
}

Класс ParsingExchange c методом run:

public class ParsingExchange {
    @Override
    public void run() {
        List<User> users = new ArrayList();
        users.add("какие-то данные")
    }
}

Проблема в том, что для отправки сообщения мне надо в run вызвать execute, а он есть только в классе Main (наследование от класса из библиотеки). И я не могу понять, как я должен вызвать execute из run, ведь они должны находиться в разных классах.

P.S. метод run - обязательно переопределяемый метод в ScheduledExecutorService, этот метод и будет вызываться и выполняться по моему заданному графику.


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

Автор решения: Vadik

Добавьте в класс ParsingExchange поле с типом App и инициализируйте его в конструкторе.

Тогда в методе run вы сможете вызывать метод execute для работы с ботом:

public class ParsingExchange implements Runnable {
    private final App bot;

    public ParsingExchange(App bot) {
        this.bot = bot;
    }

    @Override
    public void run() {
        try {
            bot.execute(new SendMessage("42", "Текст сообщения"));
        } catch (TelegramApiException exception) {
            throw new RuntimeException(exception);
        }
    }
}

Чтобы это заработало, класс App должен наследоваться от TelegramLongPollingBot или TelegramWebhookBot, чтобы на нем был определен метод execute.

→ Ссылка