[英]How do I keep track of requests issued/completed without the use of additional state variables? (Java/Grpc)
我正在使用在grpc-java项目中找到的StreamObserver类来设置一些双向流。
当我运行程序时,我向服务器发出的请求数量不确定,我只想在完成所有请求后在requestObserver上调用onCompleted()。
当前,为解决此问题,我正在使用变量“ inFlight”来跟踪已发出的请求,并且当响应返回时,我将“ inFlight”递减。 所以,像这样。
// issuing requests
while (haveRequests) {
MessageRequest request = mkRequest();
this.requestObserver.onNext(request);
this.inFlight++;
}
// response observer
StreamObserver<Message> responseObserver = new StreamObserver<Message> {
@Override
public void onNext(Message response) {
if (--this.onFlight == 0) {
this.requestObserver.onCompleted();
}
// work on message
}
// other methods
}
有点伪代码,但是这种逻辑有效。 但是,如果可能的话,我想摆脱“ inFlight”变量。 StreamObserver类中是否有任何东西允许这种功能,而无需其他变量来跟踪状态? 可以说明发出请求的数量以及它们何时完成的信息。
我试过在intellij IDE调试器中检查对象,但是没有任何提示。
要回答您的直接问题,只需在while循环中调用onComplete即可。 所有消息都传递给onNext
。 在幕后,gRPC将发送所谓的“半关闭”消息,表明它将不再发送任何消息,但愿意接收它们。 特别:
// issuing requests
while (haveRequests) {
MessageRequest request = mkRequest();
this.requestObserver.onNext(request);
this.inFlight++;
}
requestObserver.onCompleted();
这样可以确保所有响应均按照发送顺序发送。 在服务器端,当看到相应的onCompleted
回调时,可以通过在其观察者上调用onComplete来半关闭连接端。 (服务器端有两个观察者,一个用于从客户端接收信息,一个用于发送信息)。
回到客户端,您只需要等待服务器关闭一半就可以知道已接收并处理了所有消息。 请注意,如果有任何错误,您将获得一个onError
回调。
如果您不知道要在客户端执行多少个请求,则可以考虑使用AtomicInteger
,并在返回响应时调用decrementAndGet
。 如果返回值为0
,那么您将知道所有请求均已完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.