`
pzzy2000
  • 浏览: 25178 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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 插入数据。这里就不提供了。

 

 

 

 

 

分享到:
评论
1 楼 pzzy2000 2018-11-19  
只是初步实现,还有许多地方没有考虑周全,只是实现了初步功能

相关推荐

Global site tag (gtag.js) - Google Analytics