项目有一个需求,就是app用户会设置很多个人的待办事项,同时可以设置短信提醒,到一个设定的时间点,服务器就需要调用SMS系统发送短信,而且可以设置为每隔一段时间提醒一次。
对于这么一个需求,大家有什么思路呢?
我首先想到的是java的TimerTask,每个待办事项都单独建立一个线程执行TimerTask,但我担心这样一来会有太多太多的线程,因为用户可能会很多,而每个用户又可以有很多的待办事项。这样的线程会不会很耗资源?服务器负载会不会有问题?
其次能够节省服务器资源的就是采用定时扫描了,但这种方案的缺点也显而易见,主要是扫描的频率问题,过高加大数据库负载,过小及时性不好。
如何既能保证不耗费服务器资源,而又具备很高的及时性呢?
不知道大家有什么好的方案,java不太熟练,求指教。
------解决思路----------------------
一个独立线程就可以搞定了。起一个线程。给定一个间隔时长,如1分钟。每1分钟取出库中可以发送短信的用户进行发送。然后按规定间隔时长休眠下。抽象代码如下:
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
//select * from user where xxxx 查找可以进行发送的用户
List<String> userList = new ArrayList<String>();
for (String uid : userList) {
//调用接口发送短信
sendSMS(uid);
}
TimeUnit.MINUTES.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
------解决思路----------------------
可以看下DelayQueue
------解决思路----------------------
不会,ScheduledThreadPoolExecutor内部会有多个线程去定时从队列中取出可执行的任务进行执行,delay只是将任务的执行时间往后推而已。