Rx java Rx Netty:Async客户端不断获得;“内容流已被处置”;错误

Rx java Rx Netty:Async客户端不断获得;“内容流已被处置”;错误,rx-java,rx-netty,Rx Java,Rx Netty,在下面的代码中,我尝试使用Rx Netty构建一个简单的异步HTTP客户机,该客户机向api发出75个POST请求。我遇到的问题是,我一直得到一个“java.lang.IllegalStateException:内容流已被释放”错误 我做错了什么?是否与此有关: NioEventLoopGroup提供程序=新的NioEventLoopGroup(); HttpClient=newhttpclientbuilder(“my api.com”,80) .eventloop(提供程序) .build(

在下面的代码中,我尝试使用Rx Netty构建一个简单的异步HTTP客户机,该客户机向api发出75个POST请求。我遇到的问题是,我一直得到一个“java.lang.IllegalStateException:内容流已被释放”错误

我做错了什么?是否与此有关:

NioEventLoopGroup提供程序=新的NioEventLoopGroup();
HttpClient=newhttpclientbuilder(“my api.com”,80)
.eventloop(提供程序)
.build();
Gson Gson=新的Gson();
可观测范围(1,75,调度程序,从(提供者))
.flatMap(计数->{
数据=新数据(“测试”+计数);
返回client.submit(
HttpClientRequest.createPost(“/create”)
.withHeader(“授权”,AUTH_标题)
.withHeader(“内容类型”、“应用程序/json”)
.withContent(gson.toJson(数据))
);
})
.flatMap(响应->{
返回response.getContent().map((ByteBuf内容)->{
返回gson.fromJson(content.toString(Charset.defaultCharset()),OtherData.class);
});
})
.订阅(
data->logger.info(“项目完成”),
呃->{
logger.error(“error”,err);
provider.shutdownGracefully();
},
() -> {
logger.info(“完成”);
provider.shutdownGracefully();
}
);

我意识到,当您执行
response.getContent()
时,需要在映射内完成,而不是在平面映射内完成。例如:

NioEventLoopGroup provider = new NioEventLoopGroup();

HttpClient<ByteBuf, ByteBuf> client = new HttpClientBuilder<ByteBuf, 
ByteBuf>("my-api.com", 80)
.eventloop(provider)
.build();

Gson gson = new Gson();

Observable.range(1, 75, Schedulers.from(provider))
.flatMap(count -> {
  Data data = new Data("test" + count);

  return client.submit(
      HttpClientRequest.createPost("/create")
          .withHeader("Authorization", AUTH_HEADER)
          .withHeader("Content-Type", "application/json")
          .withContent(gson.toJson(data))
  );
})
// map not flatMap
.map(response -> {
  return response.getContent().map((ByteBuf content) -> {
    return gson.fromJson(content.toString(Charset.defaultCharset()), OtherData.class);
  });
})
.subscribe(
    data -> logger.info("item done"),
    err -> {
      logger.error("Error", err);

      provider.shutdownGracefully();
    },
    () -> {
      logger.info("done");
      provider.shutdownGracefully();
    }
);
NioEventLoopGroup提供程序=新的NioEventLoopGroup();
HttpClient=newhttpclientbuilder(“my api.com”,80)
.eventloop(提供程序)
.build();
Gson Gson=新的Gson();
可观测范围(1,75,调度程序,从(提供者))
.flatMap(计数->{
数据=新数据(“测试”+计数);
返回client.submit(
HttpClientRequest.createPost(“/create”)
.withHeader(“授权”,AUTH_标题)
.withHeader(“内容类型”、“应用程序/json”)
.withContent(gson.toJson(数据))
);
})
//地图不是平面地图
.map(响应->{
返回response.getContent().map((ByteBuf内容)->{
返回gson.fromJson(content.toString(Charset.defaultCharset()),OtherData.class);
});
})
.订阅(
data->logger.info(“项目完成”),
呃->{
logger.error(“error”,err);
provider.shutdownGracefully();
},
() -> {
logger.info(“完成”);
provider.shutdownGracefully();
}
);

提交()的结果完成时,
客户端是否未关闭?@BobDalgleish我不这么认为。这种错误经常发生,但并非总是如此。有时,这段代码可以正常工作。
NioEventLoopGroup provider = new NioEventLoopGroup();

HttpClient<ByteBuf, ByteBuf> client = new HttpClientBuilder<ByteBuf, 
ByteBuf>("my-api.com", 80)
.eventloop(provider)
.build();

Gson gson = new Gson();

Observable.range(1, 75, Schedulers.from(provider))
.flatMap(count -> {
  Data data = new Data("test" + count);

  return client.submit(
      HttpClientRequest.createPost("/create")
          .withHeader("Authorization", AUTH_HEADER)
          .withHeader("Content-Type", "application/json")
          .withContent(gson.toJson(data))
  );
})
// map not flatMap
.map(response -> {
  return response.getContent().map((ByteBuf content) -> {
    return gson.fromJson(content.toString(Charset.defaultCharset()), OtherData.class);
  });
})
.subscribe(
    data -> logger.info("item done"),
    err -> {
      logger.error("Error", err);

      provider.shutdownGracefully();
    },
    () -> {
      logger.info("done");
      provider.shutdownGracefully();
    }
);