首页 文章

使用application / stream json时,WebFlux不发送数据

提问于
浏览
0

我有一个反应核心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 回答

  • 1

    对于反应类型,nothing happens until you subscribe - 构建反应式管道将不会执行's it'应该执行的操作,只有订阅它才会启动该进程 .

    有几种订阅方式:

    • 调用任何 subscribe 变体 . 他们中的许多人将lambda视为在处理完成时执行的参数,或者以错误结束 . 使用空变量有点风险,因为它只是启动执行但你没有得到任何回调 . 从技术上讲,没有任何东西在等待它,因此JVM可以在处理完成之前退出

    • 调用任何 block / collect 方法 . 这不仅订阅,而且还返回预期值 .

    这两种选择都不应该在返回反应类型的方法中完成,否则会导致应用程序出现严重问题 .

相关问题