加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

阻塞队列实现日志接口开发

发布时间:2021-05-21 06:02:48 所属栏目:大数据 来源: https://www.jb51.cc
导读:前言 近日开发一个日志接口,供其他系统通过 webservice 进行调用。考虑到并发,多线程决定使用阻塞队列实现日志接口。记录实现的过程,供大家参考,对阻塞队列不了解的,可以参照上一篇博文。 实现阻塞队列 public class RemoteUpgradeLogQueue {?????priva

前言

近日开发一个日志接口,供其他系统通过 webservice 进行调用。考虑到并发,多线程决定使用阻塞队列实现日志接口。记录实现的过程,供大家参考,对阻塞队列不了解的,可以参照上一篇博文。

实现阻塞队列

public class RemoteUpgradeLogQueue {

?????private static RemoteUpgradeLogQueue remoteUpgradeLogQueue? = new RemoteUpgradeLogQueue();

?????//定义一个阻塞队列

?????private <u>BlockingQueue</u> blockingQueue = new 
LinkedBlockingQueue<>();

?????private RemoteUpgradeLogQueue(){}

?????public static RemoteUpgradeLogQueue getInstance(){

???????????return remoteUpgradeLogQueue;

?????}

?????public Boolean push(RemoteUpgradeLogInfo 
remoteUpgradeLogInfo){

???????????return <u>this</u><u>.</u><u>blockingQueue</u><u>.add(</u><u>remoteUpgradeLogInfo</u><u>)</u>;

?????}

?????public RemoteUpgradeLogInfo pop(){

???????????RemoteUpgradeLogInfo remoteUpgradeLogInfo = null;

???????????try {

????????????????remoteUpgradeLogInfo = (RemoteUpgradeLogInfo) 
this.blockingQueue.take();

???????????} catch (InterruptedException e) {

????????????????System.out.println("从队列中取出日志错误!");

???????????}

???????????return remoteUpgradeLogInfo;

?????}

?????public int size(){

???????????return this.blockingQueue.size();

?????}

}

定义消费者

service调用的方法就为具体的处理日志的方法

@Component

public class DealRemoteUpgradeLogQueue {



?????@Autowired

?????private RemoteUpgradeLogService remoteUpgradeLogService;

?????

?????@PostConstruct

?????public void startLogThread(){

???????????ExecutorService e = Executors.newFixedThreadPool(1);

???????????e.submit(new PopLogInfo(remoteUpgradeLogService));

?????}

?????

?????class PopLogInfo implements Runnable {

???????????RemoteUpgradeLogService remoteUpgradeLogService;



??????? public PopLogInfo(RemoteUpgradeLogService 
remoteUpgradeLogService) {

??????????? this.remoteUpgradeLogService = 
remoteUpgradeLogService;

??????? }



??????? @Override

??????? public void run() {

??????????? while (true) {

??????????????? try {

??????????????? ??RemoteUpgradeLogInfo remoteUpgradeLogInfo = RemoteUpgradeLogQueue.getInstance().pop();

??????????????????? if(remoteUpgradeLogInfo!=null){

??????????????????? ????remoteUpgradeLogService.saveLogInfo(remoteUpgradeLogInfo);

??????????????????? }

??????????????? } catch (Exception e) {

??????????????????? e.printStackTrace();

??????????????? }

??????????? }

??????? }

??? }
}


实现生产者

生产者直接往对列中 push 即可。

RemoteUpgradeLogQueue.getInstance().push(remoteUpgradeLogInfo);

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读