Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带背压的Vert.x重型计算的输出结果_Java_Rx Java_Vert.x - Fatal编程技术网

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(可观察);
根据此处的文档: