Java GRPC超时机制
所谓困难,则是激发个人抵制困难的机会,激发新能力的机会;
—
Java的gRPC没有没有Timeout机制,不过在其中增加了Deadline机制;但使用时容易出错,以下为我踩的几个坑;
引入gRPC超时机制的原因是因为其他服务请求gRPC所在服务,若gRPC一直执行不完,会导致任务堆积;
创建后持续报错:
@PostConstruct private void init() { tesseractServiceBlockingStub = initAuthGRCTesseractStub(tesseractGrpcUrl, tesseractToken); } //////// public TesseractServiceGrpc .TesseractServiceBlockingStub initAuthGRCTesseractStub(String url, String token) { log.info("oAuth GRPC Init url:{},interiorToken:{}", url, token); // 构建channel 单例 ManagedChannel channel = genChannel(url); Metadata extraHeaders = genMetadata(token); TesseractServiceGrpc.TesseractServiceBlockingStub simpleStub = TesseractServiceGrpc .newBlockingStub(channel) .withInterceptors(); TesseractServiceGrpc.TesseractServiceBlockingStub stub = MetadataUtils .attachHeaders(simpleStub, extraHeaders); log.info("Tesseract oAuth GRPC Init success"); return stub; }
注意:在初始化时不要设置超时时间
调用:(在调用时设置超时时间)
UserInfo userInfo;
synchronized(this.class){
userInfo = stub
.withDeadlineAfter(AUTH_MAX_TIMEOUT, TimeUnit.MICROSECONDS)
.getUserInfo(token);
}
当然直接用synchronized不太优雅,同学们可以自行使用自认为更优雅的锁,只要保证在设置超时与进行gRPC在同一个锁内即可;