前言
近日开发一个日志接口,供其他系统通过 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);