1. 程式人生 > 其它 >阻塞佇列實現日誌介面開發

阻塞佇列實現日誌介面開發

技術標籤:java佇列多執行緒rabbitmq併發程式設計

前言

近日開發一個日誌介面,供其他系統通過 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);