我遇到了一个非常奇怪的问题:基本上,我正在用Java实现服务器流式grpc客户端,并且我将微配置文件用作库/结构。当涉及到自动重试和回退时,microprofiles具有非常方便的拦截器,但是它取决于在带有拦截器注释的函数中引发的异常,否则不会触发重试。
对于一元grpc调用,此方法工作正常,与普通REST调用非常相似。但是,当使客户端成为grpc服务器端流时,protobuf将创建它自己的线程并请求回调以处理onNext,onError和onCompleted。因此,在流范围内调用onError时,引发的任何异常都不会发送回用于启动流的任何函数,因此不会引发引发@Retry的异常。
无法更改异步流的处理方式,也无法更改@Retry的触发方式。 Grpc是生成的代码,而@Retry触发器基于微型档案库。
示例:
@Retry(
retryOn = {IOException.class,TimeoutException.class,StatusRuntimeException.class},maxDuration = 10,durationUnit = ChronoUnit.SECONDS,maxRetries = 1,delay = 10,delayUnit = ChronoUnit.SECONDS
)
public void subscribeToLocations() {
// --> Throwing an exception here triggers the @Retry <--
Subscriberequest locSubscriberequest = Subscriberequest.newBuilder().build();
streamObserver = grpcStreamHandler();
grpcBlockingstub.subscribeServerStreaming(locSubscriberequest,streamObserver); // Can't change this.
}
private StreamObserver<Subscriberesponse> grpcStreamHandler() {
return new StreamObserver<Subscriberesponse>() {
@Override
public void onNext(Subscriberesponse value) {
// Handle grpc response
}
@Override
public void onError(Throwable t) {
// --> ERROR: Here,it should trigger the @Retry somehow. <--
}
@Override
public void onCompleted() {
// Handle oncomplete
}
};
}
我试图找到解决方案的时间超过了我希望承认的时间,但是我仍然茫然。有没有一种方法可以在一个范围内引发异常,而该范围又终止于另一个范围?还有其他解决方法吗?