如何在另一个线程的函数中引发异常?

我遇到了一个非常奇怪的问题:基本上,我正在用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
      }
    };
  }

我试图找到解决方案的时间超过了我希望承认的时间,但是我仍然茫然。有没有一种方法可以在一个范围内引发异常,而该范围又终止于另一个范围?还有其他解决方法吗?

SODOU619157158 回答:如何在另一个线程的函数中引发异常?

您在此处混合了同步操作和异步操作,因此您需要清楚地定义什么是“成功”,并且不需要重试。这可能取决于您的逻辑,流式传输的几种选择:

  • 至少收到一次对onNext的更新,然后完成或出错
  • onCompleted已收到,无论是否进行了任何更新

一旦定义了“成功”规则,就可以将订阅包装到Future中,并等待提供的超时解决该订阅。如果未解决,请从原始调用中引发Exception。

本文链接:https://www.f2er.com/2577036.html

大家都在问