把 ES 的“回调式”代码吃透,最忌东看一个 listener 西看一个 wrap。按下面 **4 步闭环路线** 走,**一周就能脱盲,两周可写 PR 级代码**。
--------------------------------------------------
① 先背下“一张图 + 三句口诀”
- 图(记住即可):
```
void foo(..., ActionListener<R> l)
├─ 成功 → l.onResponse(R)
└─ 失败 → l.onFailure(Exception)
```
- 口诀:
1. **无返回值**,最后一个参数永远是 `ActionListener<XXX>`;
2. **结果不 return,全靠回调**;
3. 链式用 `delegateFailure` / `map` / `run`,**绝不自己 new**。
--------------------------------------------------
② 5 个最小可运行样板
把下面 5 个例子 **单步跟一遍**(本地 IDEA 断点),就覆盖了 90 % 高频模式:
| 样板 | 入口类 | 关键回调 |
|---|---|---|
| 1. 建索引 | `TransportCreateIndexAction` | `CreateIndexService#createIndex` 里的 `ActionListener<ClusterStateUpdateResponse>` |
| 2. 写文档 | `TransportBulkAction` | `BulkOperation#run` → `ActionListener<BulkResponse>` |
| 3. 搜索 | `TransportSearchAction` | `SearchService#executeQueryPhase` → `ActionListener<SearchResponse>` |
| 4. 集群状态 | `TransportClusterHealthAction` | `ClusterService#submitStateUpdateTask` → `ActionListener<ClusterState>` |
| 5. 分片恢复 | `PeerRecoveryTargetService` | `startRecovery` → `ActionListener<RecoveryResponse>` |
**操作提示**
- 把日志调到 DEBUG,断点打在 `ActionListener.wrap` 那一行,**一路 F8 跟回调**,看结果怎么一步步传回 Netty。
--------------------------------------------------
③ 手写 3 个“玩具链”
用 ES

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



