java - Java程序保持运行:由ScheduledExecutorService调度的Telegram bot即使在终止时也会继续发送消息
问题描述
我有一个机器人,它首先创建一组消息,然后将这些消息发送到一个频道。该程序使用ScheduledExecutorService
并且有两个Runnable
s和两个线程:第一个线程填充数组,如果数组不为空,第二个线程发送请求。在请求之后,将从阵列中删除一条消息。该消息包含文本和 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 连接,消息将停止发送 - 直到我再次打开它。发生了什么事,我该如何阻止它?
我也在进行日志记录:对于每条消息,都会在文本文件中创建一个条目。但是,没有为这些连续请求创建条目。这让我觉得有一些缓存正在进行,这些请求以某种方式被放入某个队列中,直到现在才被发送......
解决方案
推荐阅读
- java - Cucumber Java 如何更新 DataTable 中的元素
- mongodb - 使用测试容器和 docker 的集成测试问题“原因:java.lang.NullPointerException:未指定 containerId”
- excel - 在 Power Pivot DAX 中获取全年工作日
- javascript - 使用外部 json 数据在画布 js 中渲染图形
- ubuntu - 在 ubuntu 上构建 ffmpeg:构建 nasm 失败
- jenkins-pipeline - 神器配置
- c# - 获取与 LINQ to XML 中的模式匹配的属性值的 C# Lambda 方法语法
- vue.js - 使用 v-for 检索被点击元素的数据属性值
- javascript - Actions on Google - 未找到应用请求许可的意图
- python - 如何将列拆分为具有相同列名并在 Python 中具有相同值的两个?