javaFlatmapDivideAsyncBug - javafaltmap流异步bug

1 考虑这么一部分代码

1
2
3
4
5
6
7
flatMap(queryResponseAfterAsr ->
instanceService.getSaaSByPaasEnvAndRegionWithAlibaba(instance)
.publishOn(Schedulers.boundedElastic())
.flatMap(saas -> { // 分出来三个流,分别是saas1 saas2 saas3
queryResponseAfterAsr.saasInstance = saas; // 1
return saasLogGetter.dealInputRequest(queryResponseAfterAsr) // 2
.flatMap(saasLogGetter::buildAndExecQuerySql); // 3

注意,上述看起来保证了在2,3过程当中,1的saasInstance为2,3中的instanceId。

但实际上可能由saas1流里的3的某个部分block了(比如异步开线程查了数据库)
,然后faltmap的第saas2,saas3对应的流修改queryResponseAfterAsr中的saasInstance,
从而导致saas1流看到的queryResponseAfterAsr.saasInstance不再最初的saas1。

2 总结

一个好的思维模式:流之间去耦合是必要的,若不同的流有相同的依赖状态,确保每个流拥有它的一个复制。