PowerJob的DatabaseMonitorAspect源碼流程
序
本文主要研究一下PowerJob的DatabaseMonitorAspect
DatabaseMonitorAspect
tech/powerjob/server/persistence/monitor/DatabaseMonitorAspect.java
@Slf4j @Aspect @Component @RequiredArgsConstructor public class DatabaseMonitorAspect { private final MonitorService monitorService; @Around("execution(* tech.powerjob.server.persistence.remote.repository..*.*(..))") public Object monitorCoreDB(ProceedingJoinPoint joinPoint) throws Throwable { return wrapperMonitor(joinPoint, DatabaseType.CORE); } @Around("execution(* tech.powerjob.server.persistence.local..*.*(..))") public Object monitorLocalDB(ProceedingJoinPoint joinPoint) throws Throwable { return wrapperMonitor(joinPoint, DatabaseType.LOCAL); } //...... }
DatabaseMonitorAspect攔截了remote和local的repository,然后執(zhí)行wrapperMonitor
wrapperMonitor
private Object wrapperMonitor(ProceedingJoinPoint point, DatabaseType type) throws Throwable { String classNameMini = AOPUtils.parseRealClassName(point); final String methodName = point.getSignature().getName(); DatabaseEvent event = new DatabaseEvent().setType(type) .setServiceName(classNameMini) .setMethodName(methodName) .setStatus(DatabaseEvent.Status.SUCCESS); long startTs = System.currentTimeMillis(); try { final Object ret = point.proceed(); event.setRows(parseEffectRows(ret)); return ret; } catch (Throwable t) { event.setErrorMsg(t.getClass().getSimpleName()).setStatus(DatabaseEvent.Status.FAILED); throw t; } finally { long cost = System.currentTimeMillis() - startTs; monitorService.monitor(event.setCost(cost)); } }
wrapperMonitor主要是構(gòu)建DatabaseEvent,成功時(shí)獲取effectRows,異常時(shí)獲取erroMsg,最后計(jì)算耗時(shí),執(zhí)行monitorService.monitor
MonitorService
tech/powerjob/server/monitor/MonitorService.java
public interface MonitorService { void monitor(Event event); }
MonitorService定義了monitor方法
PowerJobMonitorService
tech/powerjob/server/monitor/PowerJobMonitorService.java
@Slf4j @Component public class PowerJobMonitorService implements MonitorService { private final List<Monitor> monitors = Lists.newLinkedList(); public PowerJobMonitorService(List<Monitor> monitors) { monitors.forEach(m -> { log.info("[MonitorService] register monitor: {}", m.getClass().getName()); this.monitors.add(m); }); } @Override public void monitor(Event event) { monitors.forEach(m -> m.record(event)); } }
PowerJobMonitorService是實(shí)現(xiàn)了MonitorService接口,其monitor方法遍歷monitors,挨個(gè)執(zhí)行record方法
Monitor
tech/powerjob/server/monitor/Monitor.java
public interface Monitor { /** * 全局上下文綁定 & 初始化 */ void init(); /** * 記錄監(jiān)控事件 * 請(qǐng)注意該方法務(wù)必異步不阻塞?。?! * @param event 事件 */ void record(Event event); }
Monitor接口定義了record方法
LogMonitor
tech/powerjob/server/monitor/monitors/LogMonitor.java
@Component public class LogMonitor implements Monitor, ServerInfoAware { /** * server 啟動(dòng)依賴 DB,DB會(huì)被 monitor,因此最初的幾條 log serverInfo 一定為空,在此處簡(jiǎn)單防空 */ private ServerInfo serverInfo = new ServerInfo(); private static final String MDC_KEY_SERVER_ID = "serverId"; @Override public void init() { } @Override public void record(Event event) { MDC.put(MDC_KEY_SERVER_ID, String.valueOf(serverInfo.getId())); LoggerFactory.getLogger(event.type()).info(event.message()); } @Override public void setServerInfo(ServerInfo serverInfo) { this.serverInfo = serverInfo; } }
LogMonitor實(shí)現(xiàn)了Monitor, ServerInfoAware接口,其record方法通過(guò)logger打印event的message
小結(jié)
DatabaseMonitorAspect攔截了remote和local的repository,然后執(zhí)行wrapperMonitor;wrapperMonitor主要是構(gòu)建DatabaseEvent,成功時(shí)獲取effectRows,異常時(shí)獲取erroMsg,最后計(jì)算耗時(shí),執(zhí)行monitorService.monitor;LogMonitor的record方法通過(guò)logger打印event的message。
以上就是PowerJob DatabaseMonitorAspect源碼流程的詳細(xì)內(nèi)容,更多關(guān)于PowerJob DatabaseMonitorAspect的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring MVC中使用Google kaptcha驗(yàn)證碼的方法詳解
kaptcha 是一個(gè)非常實(shí)用的驗(yàn)證碼生成工具。有了它,你可以生成各種樣式的驗(yàn)證碼,因?yàn)樗强膳渲玫?,下面這篇文章主要給大家介紹了關(guān)于Spring MVC中使用Google kaptcha驗(yàn)證碼的方法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-10-10Springboot實(shí)現(xiàn)TLS雙向認(rèn)證的方法
本文介紹了使用keytool生成和管理自簽名CA證書、服務(wù)器證書和客戶端證書的方法,適合Java生態(tài)系統(tǒng),通過(guò)配置信任庫(kù)和服務(wù)器/客戶端配置,實(shí)現(xiàn)了Spring Boot中的TLS雙向認(rèn)證,感興趣的朋友一起看看吧2025-02-02SpringBoot啟動(dòng)過(guò)程逐步分析講解
這篇文章主要介紹了SpringBoot啟動(dòng)過(guò)程的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-01-01Springboot mybatis plus druid多數(shù)據(jù)源解決方案 dynamic-datasource的使用詳
這篇文章主要介紹了Springboot mybatis plus druid多數(shù)據(jù)源解決方案 dynamic-datasource的使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Spring Boot MyBatis 連接數(shù)據(jù)庫(kù)配置示例
本篇文章主要介紹了Spring Boot MyBatis 連接數(shù)據(jù)庫(kù)示例的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02Spring框架實(shí)現(xiàn)AOP的兩種方式詳解
這篇文章主要為大家詳細(xì)介紹了Spring框架實(shí)現(xiàn)AOP的兩種方式,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定的借鑒價(jià)值,需要的可以參考一下2022-09-09