gpt4 book ai didi

java - ClientCallStreamObserver isReady 永远不会返回 true

转载 作者:行者123 更新时间:2023-12-02 12:53:29 25 4
gpt4 key购买 nike

我正在制作一个输入流速率计。它基本上是一个公开请求流调用并计算每秒可以处理多少条消息的服务。

由于客户端在发送消息时是完全异步的,因此我使用 ClientCallStreamObserver 在流准备就绪时开始发送消息,以避免内存溢出。

客户端代码如下所示:

public static void main(String[] args) throws Exception {
ManagedChannel channel = ManagedChannelBuilder.forAddress("server", 4242).usePlaintext(true).build();
ServerGrpc.ServerStub asyncStub = ServerGrpc.newStub(channel);


StreamObserver<MarketDataOuterClass.Trade> inputStream = asyncStub.reportNewTradeStream(new StreamObserver<Empty>() {
@Override
public void onNext(Empty empty) {

}

@Override
public void onError(Throwable throwable) {
logger.info("on error response stream");
}

@Override
public void onCompleted() {
logger.info("on completed response stream");
}
});

final ClientCallStreamObserver<MarketDataOuterClass.Trade> clientCallObserver = (ClientCallStreamObserver<MarketDataOuterClass.Trade>) inputStream;

while (!clientCallObserver.isReady()) {
Thread.sleep(2000);
logger.info("stream not ready yet");
}

counter.setLastTic(System.nanoTime());

while (true) {
counter.inc();
if (counter.getCounter() % 15000 == 0 ) {
long now = System.nanoTime();
double rate = (double) NANOSEC_TO_SEC * counter.getCounter() / (now - counter.getLastTic());
logger.info("rate: " + rate + " msgs per sec");
counter.clear();
counter.setLastTic(now);
}
inputStream.onNext(createRandomTrade());
}
}

我对 isReady 的观察循环永无止境。

OBS:我使用 kubernetes 集群来服务我的测试,服务器正在接收调用并返回 StreamObserver 实现。

最佳答案

只要 RPC 不会立即出错/完成,

isReady 最终应该返回 true。但代码没有正确观察流量控制。

每次调用 onNext() 发送请求后,isReady() 可能会开始返回 false。您的 while (true) 循环应该在每次迭代开始时进行 isReady() 检查。

最好不要进行轮询,而是调用 serverCallObserver.setOnReadyHandler(yourRunnable) 以在调用准备好发送时收到通知。请注意,您仍应检查 yourRunnable 内的 isReady(),因为可能存在虚假/过时的通知。

关于java - ClientCallStreamObserver isReady 永远不会返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44524718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com