Spring 如何转换vert.x ReactiveReadStream<;文件>;以反应写入团队<;缓冲区>;

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

我有一个简单的用例。这是进行rest调用,查询mongo,然后将任意大的数据流返回给客户端,所有这些都使用反应流类型的背压管理

使用SpringWebFlux和Reactor很容易实现这一点。我现在正试图使用vert.x实现同样的目标,作为实现易用性的比较

在发现vert.x mongo客户端缺乏任何管理背压的支持后,我现在尝试使用WebFlux mongo客户端,然后通过vert.x HttpResponse将数据抽回,如下代码所示:

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数组中