redis lits queue 和 ThreadPoolExecutor 结合

今天遇到一个 ThreadPoolExecutor 队列 问题。

需求如下:

1:处于成本和人员技术水平限制,不可能采用高大上的系统。

2:项目周期短。

3:队列必须顺序取出,同时过滤掉超时数据。

4:多个系统。

实现原理:

1:public class CameraRequestQueue implements BlockingQueue<Runnable> ;

     继承BlockingQueue<Runnable> ;

2:public class RedisCameraRequestQueue extends CameraRequestQueue 

      继承CameraRequestQueue ;

3:实现 如下方法:

     @Override

public int size() {

return  Redis List Queue Size ;

}

@Override

public boolean isEmpty() {

return  Redis List Queue isEmpty();

}

// 获取并移除此队列的头部,在元素变得可用之前一直等待(如果有必要)。

@Override

public ExRunnable take() throws InterruptedException {

CameraRequestBean msg = Redis List Queue .take();

if (msg == null) {

return null;

} else {

ExRunnable iExRunnable = new ExRunnable(msg, cameraRequestHandFactory);

iExRunnable.setPublicMediaService(publicMediaService);

return iExRunnable;

}

}

@Override

public int remainingCapacity() {

return Integer.MAX_VALUE;

}

3:线程池:

ThreadPoolExecutor executor = new ThreadPoolExecutor(initCount, MAX_SIZE, 5, TimeUnit.MILLISECONDS,redisCameraRequestQueue, new CameraRequestHandThreadFactory(),

new ThreadPoolExecutor.AbortPolicy());

4:初始化:

     executor.prestartAllCoreThreads();

5:public class ExRunnable implements Runnable 。

      //具体实现处理数据的方法实现。

这时:当有其他系统有数据插入到对应的redis list queue 时,本方法,可以自动从redis list queue 中取出数据。

1:优点:方便,代码简介,一般的开发人员都能实现。

2:不足:

      1:此方法暂时不能保证重要性数据的正确执行。

      2:在关闭线程池的时候,可能会掉数据。

      3:本方法还没在redis lits queue 集群里面测试过。(因没有多余的服务器来搭建系统)。

      4:ThreadPoolExecutor  本身有线程不停的从 redis list queue 取出数据,可能会有一些性能损耗。

本人:使用场景:

           1:2000多个摄像头排队调用,如果调用方调用失败可以重新排队调用。

           2:发送UDP数据。

以下是关键代码。redis 插入数据。这里就不提供了。

相关推荐