首页 > 解决方案 > Java程序保持运行:由ScheduledExecutorService调度的Telegram bot即使在终止时也会继续发送消息

问题描述

我有一个机器人,它首先创建一组消息,然后将这些消息发送到一个频道。该程序使用ScheduledExecutorService并且有两个Runnables和两个线程:第一个线程填充数组,如果数组不为空,第二个线程发送请求。在请求之后,将从阵列中删除一条消息。该消息包含文本和 gif:

public class BotTest {
    private static final ScheduledExecutorService scheduler =
            Executors.newScheduledThreadPool(2);


    public static void main(String[] args) throws Exception {
        final MyBot bot  = new MyBot();


        ArrayList<Message> messages = new ArrayList<>();
        Runnable createMessages =
                new Runnable(){
                    public void run(){
                      //...creating messages
                    }
                };
        scheduler.scheduleAtFixedRate(createMessages, 0, 1, TimeUnit.MINUTES);

        scheduler.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                    //if (messages.size()<=0)  {                   
                    while (messages.size()<=0)  {
                        System.out.println("Array is empty");
                    }
                    //else  {
                    try {
                        final Message message = messages.get(0);
                        messages.remove(0);

                        bot.sendMessage(message);
                    } 
                    catch (Throwable e) {
                        e.printStackTrace();
                    }
                    //}
            }
        }, 0, 1, TimeUnit.SECONDS);


    }
}

sendMessage

public int sendMessage(Message message) throws Exception  {
                boolean result = false;

                String linkText = rootLink + token + "/sendMessage?chat_id=@MyChat&text=" + message.getText();
                String linkGif = rootLink + token + "/sendAnimation?chat_id=@MyChat&animation=" + URLEncoder.encode(message.getUrl(), "UTF-8");

                int responseCode1 = new TelegramRequest(linkText).send().getCode();
                int responseCode2 = new TelegramRequest(linkGif).send().getCode(); 

                //...logging in text file

                return responseCode1 + responseCode2;
}

我的电脑(Windows 7,IDE Intellij)一直在发送消息,即使我已经很久(几个小时前)终止了这个过程。如果我关闭计算机上的 Internet 连接,消息将停止发送 - 直到我再次打开它。发生了什么事,我该如何阻止它?

我也在进行日志记录:对于每条消息,都会在文本文件中创建一个条目。但是,没有为这些连续请求创建条目。这让我觉得有一些缓存正在进行,这些请求以某种方式被放入某个队列中,直到现在才被发送......

标签: javaintellij-ideatelegramtelegram-botscheduledexecutorservice

解决方案


推荐阅读