欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PowerJob的DatabaseMonitorAspect源碼流程

 更新時(shí)間:2024年01月09日 08:34:23   作者:codecraft  
這篇文章主要為大家介紹了PowerJob的DatabaseMonitorAspect源碼流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

本文主要研究一下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)證碼的方法詳解

    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-10
  • SpringMVC圖片文件跨服務(wù)器上傳

    SpringMVC圖片文件跨服務(wù)器上傳

    這篇文章主要為大家詳細(xì)介紹了SpringMVC圖片文件跨服務(wù)器上傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Springboot實(shí)現(xiàn)TLS雙向認(rèn)證的方法

    Springboot實(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-02
  • SpringBoot啟動(dòng)過(guò)程逐步分析講解

    SpringBoot啟動(dòng)過(guò)程逐步分析講解

    這篇文章主要介紹了SpringBoot啟動(dòng)過(guò)程的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-01-01
  • Springboot mybatis plus druid多數(shù)據(jù)源解決方案 dynamic-datasource的使用詳解

    Springboot mybatis plus druid多數(shù)據(jù)源解決方案 dynamic-datasource的使用詳

    這篇文章主要介紹了Springboot mybatis plus druid多數(shù)據(jù)源解決方案 dynamic-datasource的使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Spring Boot MyBatis 連接數(shù)據(jù)庫(kù)配置示例

    Spring Boot MyBatis 連接數(shù)據(jù)庫(kù)配置示例

    本篇文章主要介紹了Spring Boot MyBatis 連接數(shù)據(jù)庫(kù)示例的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • 詳解JAVA設(shè)計(jì)模式之模板模式

    詳解JAVA設(shè)計(jì)模式之模板模式

    這篇文章主要介紹了詳解JAVA設(shè)計(jì)模式之模板模式的的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Java 高并發(fā)一:前言

    Java 高并發(fā)一:前言

    本系列基于煉數(shù)成金課程,為了更好的學(xué)習(xí),做了系列的記錄。 本文主要介紹 1.高并發(fā)的概念,為以后系列知識(shí)做鋪墊。 2.兩個(gè)重要的定理
    2016-09-09
  • Java Collection集合的三種遍歷方式詳解

    Java Collection集合的三種遍歷方式詳解

    Collection集合遍歷的方式有三種,迭代器foreach/增強(qiáng)for循環(huán)lambda表達(dá)式,這篇文章主要介紹了Java Collection集合的三種遍歷方式,需要的朋友可以參考下
    2022-11-11
  • Spring框架實(shí)現(xiàn)AOP的兩種方式詳解

    Spring框架實(shí)現(xiàn)AOP的兩種方式詳解

    這篇文章主要為大家詳細(xì)介紹了Spring框架實(shí)現(xiàn)AOP的兩種方式,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定的借鑒價(jià)值,需要的可以參考一下
    2022-09-09

最新評(píng)論