## 模块说明
| | 说明 |
| --- | --- |
| | |
## 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
- 优质开源项目备忘