Spring 如何转换vert.x ReactiveReadStream<;文件>;以反应写入团队<;缓冲区>;
我有一个简单的用例。这是进行rest调用,查询mongo,然后将任意大的数据流返回给客户端,所有这些都使用反应流类型的背压管理 使用SpringWebFlux和Reactor很容易实现这一点。我现在正试图使用vert.x实现同样的目标,作为实现易用性的比较 在发现vert.x mongo客户端缺乏任何管理背压的支持后,我现在尝试使用WebFlux mongo客户端,然后通过vert.x HttpResponse将数据抽回,如下代码所示:Spring 如何转换vert.x ReactiveReadStream<;文件>;以反应写入团队<;缓冲区>;,spring,vert.x,reactive,Spring,Vert.x,Reactive,我有一个简单的用例。这是进行rest调用,查询mongo,然后将任意大的数据流返回给客户端,所有这些都使用反应流类型的背压管理 使用SpringWebFlux和Reactor很容易实现这一点。我现在正试图使用vert.x实现同样的目标,作为实现易用性的比较 在发现vert.x mongo客户端缺乏任何管理背压的支持后,我现在尝试使用WebFlux mongo客户端,然后通过vert.x HttpResponse将数据抽回,如下代码所示: public class MyMongoVerticle
public class MyMongoVerticle extends AbstractVerticle {
ReactiveMongoOperations operations;
public void start() throws Exception {
final Router router = Router.router(vertx);
router.route().handler(BodyHandler.create());
router.get("/myUrl").handler(ctx -> {
// WebFlux mongo operations returns a ReactiveStreams compatible entity
Flux<Document> mongoStream = operations.findAll(Document.class, "myCollection");
ReactiveReadStream rrs = ReactiveReadStream.readStream();
// rrs is ReactiveStream streams subscriber
mongoStream.subscribe(rrs);
// Pump pumps the rrs (ReactiveReadStream) to the HttpServerResponse (ReactiveWriteStream)
Pump pump = Pump.pump(rrs, ctx.response());
pump.start();
});
vertx.createHttpServer().requestHandler(router::accept).listen(8777);
}
}
公共类MyMongoVerticle扩展了AbstractVerticle{
合作操作的反应性;
public void start()引发异常{
最终路由器=路由器.路由器(vertx);
router.route().handler(BodyHandler.create());
router.get(“/myUrl”).handler(ctx->{
//WebFlux mongo操作返回与ReactiveStreams兼容的实体
Flux mongoStream=operations.findAll(Document.class,“myCollection”);
ReactiveReadStream rrs=ReactiveReadStream.readStream();
//rrs是反应流用户
mongoStream.subscribe(rrs);
//泵将rrs(ReactiveReadStream)泵送至HttpServerResponse(ReactiveWriteStream)
泵=泵.泵(rrs,ctx.response());
泵。启动();
});
createHttpServer().requestHandler(路由器::接受).listen(8777);
}
}
我遇到的问题是HttpServerResponse实现了ReactiveWriteStream,因此需要缓冲区而不是文档流。结果是ClassCaseException
我的问题是如何将这个文档流转换为一个ReactiveWriteStream?可能还有另一种更好的方法可以做到这一点,因此我愿意接受关于如何实现这一点的其他建议。
Pump
不适合您,因为它目前不支持转换。你必须自己实施泵。幸运的是,这应该不会太难:
Flux<Document> mongoStream = operations.findAll(Document.class, "myCollection");
ReactiveReadStream<Document> rrs = ReactiveReadStream.readStream();
mongoStream.subscribe(rrs);
HttpServerResponse outStream = ctx.response();
// Changes start here
rrs.handler(d -> {
if (outStream.writeQueueFull()) {
outStream.drainHandler((s) -> {
rrs.resume();
});
rrs.pause();
}
else {
outStream.write(d.toJson());
}
}).endHandler(h -> {
outStream.end();
});
Flux mongoStream=operations.findAll(Document.class,“myCollection”);
ReactiveReadStream rrs=ReactiveReadStream.readStream();
mongoStream.subscribe(rrs);
HttpServerResponse outStream=ctx.response();
//变化从这里开始
rrs.handler(d->{
if(outStream.writequeuefullel()){
外流.德拉汉德勒(s)->{
rrs.resume();
});
rrs.pause();
}
否则{
write(d.toJson());
}
}).endHandler(h->{
结束();
});
请注意,我不希望这比“原生”WebFlux实现更有效
此外,本例中的JSON将被破坏,因为我没有将其包装在适当的JSON数组中,因此泵将不适用于您,因为它目前不支持转换。你必须自己实施泵。幸运的是,这应该不会太难:
Flux<Document> mongoStream = operations.findAll(Document.class, "myCollection");
ReactiveReadStream<Document> rrs = ReactiveReadStream.readStream();
mongoStream.subscribe(rrs);
HttpServerResponse outStream = ctx.response();
// Changes start here
rrs.handler(d -> {
if (outStream.writeQueueFull()) {
outStream.drainHandler((s) -> {
rrs.resume();
});
rrs.pause();
}
else {
outStream.write(d.toJson());
}
}).endHandler(h -> {
outStream.end();
});
Flux mongoStream=operations.findAll(Document.class,“myCollection”);
ReactiveReadStream rrs=ReactiveReadStream.readStream();
mongoStream.subscribe(rrs);
HttpServerResponse outStream=ctx.response();
//变化从这里开始
rrs.handler(d->{
if(outStream.writequeuefullel()){
外流.德拉汉德勒(s)->{
rrs.resume();
});
rrs.pause();
}
否则{
write(d.toJson());
}
}).endHandler(h->{
结束();
});
请注意,我不希望这比“原生”WebFlux实现更有效
此外,本例中的JSON将被破坏,因为我没有将其包装在适当的JSON数组中