前阵子开发bot,准备加一个翻译功能,胡乱翻了翻api,发现百度翻译的api有免费版本,而且并不限制条数,仅限制了QPS,在简单的按照demo进行构建使用后发现效果还不错,但偶尔也会发生QPS=1不够用的时候,于是就着手进行消息队列的开发,准备优化这部分代码。
首先明确需求,翻译功能目前并没有问题,主要问题集中在消息的请求上,接收到翻译请求后,应当把原文存放在队列中,在翻译完成第一个原文后,应至少等待1s才能再次请求,在此期间接收到的翻译请求要全部放到消息队列中,并保证可以正常的加入和弹出。
参照朋友的消息队列,大致构建出了一个EventQueue
类。
public class EventQueue {
private final LinkedList<Event> queue = new LinkedList<>();
public Event next() throws InterruptedException {
synchronized (this){
while(queue.isEmpty()){
wait();
}
return queue.remove();
}
}
public void offer(Event event){
synchronized (this){
queue.offer(event);
notifyAll();
}
}
}
基本就是利用了wait()和notifyAll()来进行线程阻塞,并实现一个消息队列的基础功能。而在此基础上,我则进行了1s的线程休眠,完成了消息队列的构建。
目前的翻译器使用了单独的消息队列,仅捕获符合翻译命令正则表达式的消息,同时也仅对他们进行管理,下一步则是要对所有的信息进行监控,放入消息队列,使得整个项目更加系统化。