使用application / stream + json

时间:2018-07-23 05:53:19

标签: java reactive-programming spring-webflux project-reactor reactive

我有一个反应性的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以获取结果,我看到客户端发送了请求,但是服务器端点始终看到空的流量。拜托,任何帮助都非常感谢。

1 个答案:

答案 0 :(得分:1)

对于反应式类型,nothing happens until you subscribe-建立反应式管道将不会执行应做的事情,只有订阅该管道才能启动该过程。

有几种订阅方式:

  • 调用任何subscribe变体。它们中的许多都将lambda作为参数,这些参数在处理完成时执行,或者以错误结束。使用empty变体有点冒险,因为它只是启动执行,但是您不会收到任何回调。从技术上讲,没有什么等待它,因此JVM可以在处理完成之前退出
  • 调用任何block / collect方法。这不仅可以订阅,而且还可以返回期望值。

    这两种选择都不应在返回反应类型的方法中进行,否则将导致应用程序出现严重问题。