我有一个反应核心WebClient发布到给定的 endpoints . 有效载荷是 Job
对象的通量,内容类型是应用程序/流json Flux jobFlux = Flux.just(new Job());
Mono<JsonNode> response = localEP.post().uri( "/dev/job" )
.contentType(MediaType.APPLICATION_STREAM_JSON)
.body( BodyInserters.fromObject(jobFlux))
.retrieve()
.bodyToMono( JsonNode.class );
在服务器端,我尝试了Spring Controller样式和Spring Web Reactive FunctionHandler来处理上述调用的有效负载,其有效负载是Flux .
@PostMapping(path = "/dev/job", consumes = MediaType.APPLICATION_STREAM_JSON_VALUE)
@ResponseStatus( HttpStatus.CREATED )
public Mono<Void> loadJobs (@RequestBody Flux<Job> jobs) {
return this.repository.create(jobs);
}
在实例化新对象时,域类 Job
创建并标识:
public Job() {
UUID guid = UUID.randomUUID();
id = guid.toString();
title = "Random String";
}
存储库目前只是一个存根:
@Repository
public class DemoJobRepository implements ReactiveRepository<Job> {
private static Logger logger = LoggerFactory.getLogger(DemoJobRepository.class);
private final List<Job> jobs = Lists.newArrayList();
@Override
public Mono<Void> create(Publisher<Job> jobStream) {
return Flux.from(jobStream).doOnNext(jobs::add).then();
}
@Override
public Flux<Job> getAll() {
return Flux.fromIterable(jobs);
}
@Override
public Mono<Job> findById(String id) {
return null;
}
}
我没有看到客户端尝试发送请求者 . 我在客户端上调用 block
来获取结果,我看到客户端发送请求,但是服务器 endpoints 总是看到空的通量 . 请,任何帮助都非常感谢 .
1 回答
对于反应类型,nothing happens until you subscribe - 构建反应式管道将不会执行's it'应该执行的操作,只有订阅它才会启动该进程 .
有几种订阅方式:
调用任何
subscribe
变体 . 他们中的许多人将lambda视为在处理完成时执行的参数,或者以错误结束 . 使用空变量有点风险,因为它只是启动执行但你没有得到任何回调 . 从技术上讲,没有任何东西在等待它,因此JVM可以在处理完成之前退出调用任何
block
/collect
方法 . 这不仅订阅,而且还返回预期值 .这两种选择都不应该在返回反应类型的方法中完成,否则会导致应用程序出现严重问题 .