## 模塊說明
| | 說明 |
| --- | --- |
| | |
## repeater-aide
1. 比較器的定義是在repeater-aide中;
2. 結果的比對執行是在console的ReplayServiceImpl:
```java
public RepeaterResult<String> saveRepeat(String body) {
// 這里省略了一大段
Comparable comparable = ComparableFactory.instance().createDefault();
// simple compare
CompareResult result = comparable.compare(actual, expect);
replay.setSuccess(!result.hasDifference());
try {
replay.setDiffResult(JacksonUtil.serialize(result.getDifferences()
.stream()
.map(differenceConvert::convert)
.collect(Collectors.toList()), false));
} catch (SerializeException e) {
log.error("error occurred serialize diff result", e);
return RepeaterResult.builder().message("operate failed").build();
}
Replay calllback = replayDao.saveAndFlush(replay);
return RepeaterResult.builder().success(true).message("operate success").data("-/-").build();
}
```
比較器執行主要代碼:com.alibaba.jvm.sandbox.repeater.aide.compare.IntegratedComparator,每個比較器都會比較一遍結果。
```java
@Override
public CompareResult compare(Object left, Object right) {
// try clear last compare result
tryClear();
// dispatch compare task
List<Path> paths = new ArrayList<Path>(0);
try {
dispatch(left, right, paths);
} catch (Exception e) {
// LogUtil.error("error occurred when dispatch compare task", e);
addDifference(left, right, Difference.Type.COMPARE_ERR, paths);
}
return new CompareResult(left, right, differences);
}
public void dispatch(Object left, Object right, List<Path> paths) {
// cycle reference detect
try {
String nodeName = pathLocator.encode(paths);
leftDetector.detect(left, nodeName);
rightDetector.detect(right, nodeName);
} catch (CycleReferenceException e) {
// LogUtil.error("error occurred when dispatch compare task", e);
return;
}
// do compare,每個比較器都會比較一遍
for (Comparator comparator : comparators) {
if (comparator.accept(left, right)) {
comparator.compare(left, right, paths, this);
break;
}
}
}
```
### 自定義結果比較器
為什么要自定義結果比較器?
1. 重構等行為可能會造成包名的不一致、方法簽名不一致;
2. 字段增加也會對對比較結果產生影響;
按理來講,結果比較更加偏向于邏輯校驗。比較結果應該忽略上述問題的影響。
- 寫在前面
- 如何閱讀源碼
- 第一部分 開源框架
- Netty
- 啟動過程
- SpringSecurityOauth2
- Quartz
- quartz啟動原理
- quartz定時調度任務觸發流程
- 第二部分 優質中間件源碼分析
- Canal
- Canal是如何偽裝為mysql的slave的?
- canal源碼調試
- Sentinel
- 核心概念梳理
- 滑動窗口實現原理
- jvm-sandbox
- jvm-sandbox-repeater
- Windows環境安裝
- 結果比對
- 第三部分 優質行業項目源碼分析
- 第一章 分庫分表實踐
- sharding-jdbc
- 第二章 DDD領域驅動
- 享同科技DDD開源框架
- J-IM
- 功能測試
- 悟空CRM
- 項目搭建
- 默認密碼
- dataX-web
- 項目搭建
- 部署報錯
- dolphinscheduler
- awescnb
- geek
- chrome插件-funds
- 優質開源項目備忘