我有一个反应性的WebClient核心,可以发布到给定的端点。有效负载是Job
个对象的流量,内容类型是application / stream + 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
以获取结果,我看到客户端发送了请求,但是服务器端点始终看到空的流量。拜托,任何帮助都非常感谢。
答案 0 :(得分:1)
对于反应式类型,nothing happens until you subscribe-建立反应式管道将不会执行应做的事情,只有订阅该管道才能启动该过程。
有几种订阅方式:
subscribe
变体。它们中的许多都将lambda作为参数,这些参数在处理完成时执行,或者以错误结束。使用empty变体有点冒险,因为它只是启动执行,但是您不会收到任何回调。从技术上讲,没有什么等待它,因此JVM可以在处理完成之前退出调用任何block
/ collect
方法。这不仅可以订阅,而且还可以返回期望值。
这两种选择都不应在返回反应类型的方法中进行,否则将导致应用程序出现严重问题。