Java 带背压的Vert.x重型计算的输出结果
所讨论的应用程序处理来自客户端的请求,这需要在服务器端进行大量计算。此计算是逐件进行的,因此,如果客户阅读速度较慢,则此计算不应进行(计算应响应背压) 计算现在表示为Java 带背压的Vert.x重型计算的输出结果,java,rx-java,vert.x,Java,Rx Java,Vert.x,所讨论的应用程序处理来自客户端的请求,这需要在服务器端进行大量计算。此计算是逐件进行的,因此,如果客户阅读速度较慢,则此计算不应进行(计算应响应背压) 计算现在表示为供应商,其中get()调用可能需要很长时间,需要多次调用,直到它以null响应(无更多数据)。应在单独的线程池(与其他请求共享)中调用get(),并且仅当客户端确实能够接受数据时才应调用该线程池 我目前的代码是: ReadStream ReadStream=新的MyComplementedReadstream(供应商、执行人) .e
供应商
,其中get()
调用可能需要很长时间,需要多次调用,直到它以null
响应(无更多数据)。应在单独的线程池(与其他请求共享)中调用get()
,并且仅当客户端确实能够接受数据时才应调用该线程池
我目前的代码是:
ReadStream ReadStream=新的MyComplementedReadstream(供应商、执行人)
.exceptionHandler(请求::失败)
.endHandler(x->request.response().end());
Pump.Pump(readStream,request.response()).start();
为此,我定制了一个ReadStream
实现,这类实现很有效,但是很长,很笨重,并且存在同步问题
我不知道在vert.x/rx中是否有一种惯用的方法来实现/实例化
MyComplementedReadStream
,而不是解决这个问题。因此,对于供应商
和执行者服务
获取一个ReadStream
,它使用给定的执行者执行get()
,并且在暂停时不会生成。我对vert.x有接近0的经验,但我对rxjava有一些经验。因此,可能有更好的方法来实现这一点,但从rxjava的角度来看,您可以使用generate
方法来创建“冷”流程,它只根据需要生成项目。我相信在这种情况下,当流暂停时,不会再调用supplier.get()
,因为没有“需求”
在这里使用kotlin语法,但我认为您可以轻松地派生java版本
Flowable.generate{emitter->
val nextValue=supplier.get()
if(nextValue==null){
emitter.onComplete()
}否则{
emitter.onNext(下一个值)
}
}.subscribeOn(Schedulers.from(executor))//这将使上述回调在给定的执行器中运行
由于供应商似乎持有某种状态,因此在某些情况下,您可能希望为每个消费者生成一个“新供应商”,在这种情况下,您可以使用generate方法的重载,该方法允许指定另一个回调来获取该状态的实例(在您的情况下为供应商)
看起来您可以将可流动数据流转换为可读数据流:
ReadStream<Buffer> readStream = FlowableHelper.toReadStream(observable);
ReadStream ReadStream=FlowableHelper.toReadStream(可观察);
根据此处的文档: