阻塞队列实现日志接口开发
前言
近日开发一个日志接口,供其他系统通过 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);
![公众号](https://images.cnblogs.com/cnblogs_com/jichi/1773319/o_200525150353qrcode_for_gh_9280df3f1396_258.jpg)
作者:经典鸡翅
微信公众号:经典鸡翅
如果你想及时得到个人撰写文章,纯java的面试资料或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号)。