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 шт):
Добавьте в класс 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.