当前位置: 代码迷 >> J2EE >> 一个服务器的非一般需求,求给思路
  详细解决方案

一个服务器的非一般需求,求给思路

热度:87   发布时间:2016-04-17 23:03:27.0
一个服务器的特殊需求,求给思路
      项目有一个需求,就是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只是将任务的执行时间往后推而已。
  相关解决方案