grpc ClientCall永远不会处于就绪状态?

问题描述

我遵循https://grpc.github.io/grpc-java/javadoc/上的示例代码来测试客户端流呼叫,并发现我的ClientCall从未处于就绪状态,因此ClientCall.Listener无法正常工作。 我会错过一些东西,使其永远无法工作吗?


    ManagedChannel channel = ManagedChannelBuilder.forAddress("127.0.0.1",9091)
        .usePlaintext()
        .build();

    ClientCall<Business.SubscribeShadowConfigRequest,Business.ShadowConfigGetResponse> call =
        channel.newCall(AgentServiceGrpc.getSubscribeShadowConfigMethod(),CallOptions.DEFAULT);

    ClientCall.Listener listener = new ClientCall.Listener<Business.ShadowConfigGetResponse>() {
      @Override
      public void onMessage(Business.ShadowConfigGetResponse response) {
        // Notify gRPC to receive one additional response.
        log.info(">>> in onMessage");
        try {
          log.info(">>> response = {}",gson.toJson(Nebulav1.Config.parseFrom(Base64Utils.base64DecoderByte(response.getData().toStringUtf8()))));
        } catch (InvalidProtocolBufferException e) {
          log.error(e.getMessage());
          log.trace(e.getMessage(),e);
        }
  
        call.request(1);
      }
      
      @Override
      public void onReady() {
        log.info(">>> in onReady");
        while (call.isReady()) {
          log.info(">>> call.isReady(): {}",call.isReady());
          Business.SubscribeShadowConfigRequest req = Business.SubscribeShadowConfigRequest.newBuilder().setName("extension-nebulav1-task").build();
          call.sendMessage(req);
          call.halfClose();
          log.info(">>> call.sendMessage");
          return;
        }
      }
  
      @Override
      public void onClose(Status status,Metadata trailers) {
        log.info(">>> in onClose");
        log.info(">>> status = {}",status.getCode());
        log.info(">>> closed");
      }
    };

    call.start(listener,new Metadata());
    log.info("--- call.started");
    
    call.request(1);
    log.info("--- call.requested");

    do {
      log.info("--- call.isReady() = {}",call.isReady());
      Thread.sleep(60000);
    } while(call.isReady() != true);
    log.info("--- call.isReady() = {}",call.isReady());

日志显示我的ClientCall.isReady()在调用ClientCall.start后显示错误超过10分钟。

2020-08-22 11:36:12.374 INFO  com.company.DynamicImportApplication.logStarted[59][main] - Started DynamicImportApplication in 4.38 seconds (JVM running for 5.014)
2020-08-22 11:36:13.029 INFO  com.company.DynamicImportApplication.run[83][main] - --- call.started
2020-08-22 11:36:13.030 INFO  com.company.DynamicImportApplication.run[86][main] - --- call.requested
2020-08-22 11:36:13.031 INFO  com.company.DynamicImportApplication.run[96][main] - --- call.isReady() = false
2020-08-22 11:37:13.032 INFO  com.company.DynamicImportApplication.run[96][main] - --- call.isReady() = false
2020-08-22 11:38:13.033 INFO  com.company.DynamicImportApplication.run[96][main] - --- call.isReady() = false
2020-08-22 11:39:13.034 INFO  com.company.DynamicImportApplication.run[96][main] - --- call.isReady() = false
2020-08-22 11:40:13.034 INFO  com.company.DynamicImportApplication.run[96][main] - --- call.isReady() = false
2020-08-22 11:41:13.035 INFO  com.company.DynamicImportApplication.run[96][main] - --- call.isReady() = false
2020-08-22 11:42:13.036 INFO  com.company.DynamicImportApplication.run[96][main] - --- call.isReady() = false
2020-08-22 11:43:13.037 INFO  com.company.DynamicImportApplication.run[96][main] - --- call.isReady() = false
2020-08-22 11:44:13.038 INFO  com.company.DynamicImportApplication.run[96][main] - --- call.isReady() = false
2020-08-22 11:45:13.039 INFO  com.company.DynamicImportApplication.run[96][main] - --- call.isReady() = false
2020-08-22 11:46:13.042 INFO  com.company.DynamicImportApplication.run[96][main] - --- call.isReady() = false
2020-08-22 11:47:13.042 INFO  com.company.DynamicImportApplication.run[96][main] - --- call.isReady() = false
2020-08-22 11:48:13.043 INFO  com.company.DynamicImportApplication.run[96][main] - --- call.isReady() = false
2020-08-22 11:49:13.044 INFO  com.company.DynamicImportApplication.run[96][main] - --- call.isReady() = false

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)