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,成功時獲取effectRows,異常時獲取erroMsg,最后計算耗時,執(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是實現(xiàn)了MonitorService接口,其monitor方法遍歷monitors,挨個執(zhí)行record方法
Monitor
tech/powerjob/server/monitor/Monitor.java
public interface Monitor {
/**
* 全局上下文綁定 & 初始化
*/
void init();
/**
* 記錄監(jiān)控事件
* 請注意該方法務必異步不阻塞!??!
* @param event 事件
*/
void record(Event event);
}Monitor接口定義了record方法
LogMonitor
tech/powerjob/server/monitor/monitors/LogMonitor.java
@Component
public class LogMonitor implements Monitor, ServerInfoAware {
/**
* server 啟動依賴 DB,DB會被 monitor,因此最初的幾條 log serverInfo 一定為空,在此處簡單防空
*/
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實現(xiàn)了Monitor, ServerInfoAware接口,其record方法通過logger打印event的message
小結(jié)
DatabaseMonitorAspect攔截了remote和local的repository,然后執(zhí)行wrapperMonitor;wrapperMonitor主要是構(gòu)建DatabaseEvent,成功時獲取effectRows,異常時獲取erroMsg,最后計算耗時,執(zhí)行monitorService.monitor;LogMonitor的record方法通過logger打印event的message。
以上就是PowerJob DatabaseMonitorAspect源碼流程的詳細內(nèi)容,更多關(guān)于PowerJob DatabaseMonitorAspect的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java實現(xiàn)漢字轉(zhuǎn)unicode與漢字轉(zhuǎn)16進制實例
這篇文章主要介紹了java實現(xiàn)漢字轉(zhuǎn)unicode與漢字轉(zhuǎn)16進制的實現(xiàn)方法,是Java操作漢字編碼轉(zhuǎn)換的一個典型應用,非常具有實用價值,需要的朋友可以參考下2014-10-10

