Java 如何从通量中的项目生成项目(弹簧反应器)
我如何用反应堆通量模拟下面的场景Java 如何从通量中的项目生成项目(弹簧反应器),java,spring,spring-boot,project-reactor,reactor,Java,Spring,Spring Boot,Project Reactor,Reactor,我如何用反应堆通量模拟下面的场景 +-------+ +-------+ +-------+ | | | | -----> | | | A | ----> | B | -----> | C | | | | | -----> | | +-------+ +-------+ +
+-------+ +-------+ +-------+
| | | | -----> | |
| A | ----> | B | -----> | C |
| | | | -----> | |
+-------+ +-------+ +-------+
A
生成由B
接收的项目,该项目将发出[0..N]
由C
接收的项目
如何编写流量,以便B
可以基于A
发出的项目发出新项目
A a = ...
B b = ...
C c = ...
Flux.push((emitter) -> a.run(emitter))
.howToMapOneEelementToMany((emitter, item) -> b.handle(emitter, item); // ???
.doOnNext((item) -> c.handle(item))
.subscribe();
编辑:示例
生成Excel文件的路径A
读取Excel文件中的数据,并每行生成一项(可以是很多行,也可以是无行)B
将每一行存储在数据库中C
- 根据@sfiss
flatMap
的推荐,这似乎是一个不错的选择
ExcelFilePathReaderSink pathReader = ...
ExcelRowHandlerSink rowHandler = ...
OutputWriter outWriter = ...
Flux.push(pathReader) // A
.flatMap(rowHandler) // B
.doOnNext(outWriter) // C
.subscribe();
如果你有很多文件,那么已经是一个通量。你可以做一个平面图,用这个,每一个通量项目都会生成另一个通量行。 如果要保持数据的顺序,还有其他方法,如concatMap和flatMapSequential
public Flux<String> someMethod() {
return Flux.fromIterable(List.of("excelFileData", "excelFileData2"))
.flatMap(this::getRows);
}
private Flux<String> getRows(String file) {
return Flux.fromIterable(file.lines().collect(toList()));
}
public方法(){
返回Flux.fromIterable(列表中的(“excelFileData”、“excelFileData2”))
.flatMap(this::getRows);
}
私有流量getRows(字符串文件){
返回Flux.fromIterable(file.lines().collect(toList());
}
见反应堆文件,相当不错
但是如果你想把单声道转换成通量,你可以这样做:
public Flux<String> someMethod() {
return Mono.just("excelFileData")
.flatMapMany(this::getRows);
}
private Flux<String> getRows(String file) {
return Flux.fromIterable(file.lines().collect(toList()));
}
public方法(){
返回Mono.just(“excelFileData”)
.flatMapMany(此::getRows);
}
私有流量getRows(字符串文件){
返回Flux.fromIterable(file.lines().collect(toList());
}
也许吧。很多?平面地图@sfiss有趣的是,在不知道将创建多少新项目的情况下,如何使用它?例如,它可以与Flux.push
或类似工具一起使用吗?对于您所要求的内容,还不太清楚,因为您的代码示例与您所要求的并不完全匹配。你写每行生成一个项目
,然后你就有了一个如何从一个项目生成一个项目
我想这篇博文会给你你需要的答案