阻塞佇列實現日誌介面開發
阿新 • • 發佈:2020-12-30
前言
近日開發一個日誌介面,供其他系統通過 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);