繁体   English   中英

如何在不使用其他状态变量的情况下跟踪已发出/已完成的请求? (爪哇/ GRPC)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM