【问题标题】:How to throw an exception in a function from another thread?如何从另一个线程的函数中抛出异常?
【发布时间】:2020-03-26 09:50:38
【问题描述】:

我遇到了一个非常奇怪的问题:基本上,我在 java 中实现了一个服务器流式传输 grpc 客户端,并且我使用微配置文件作为库/结构。当涉及到自动重试和回退时,Microprofiles 有非常方便的拦截器,但它依赖于在拦截注释函数中抛出的异常,否则重试不会被触发。

对于非单一的 grpc 调用,这工作得很好,它的工作方式与普通的 REST 调用非常相似。但是当将客户端创建到 grpc 服务器端流时,protobuf 将创建它自己的线程并请求回调来处理 onNext、onError 和 onCompleted。所以当在流作用域内调用 onError 时,抛出的任何异常都不会被发送回用于启动流的任何函数,因此不会抛出任何异常来触发@Retry。

无法更改异步流的处理方式,也无法更改@Retry 的触发方式。 grpc是生成代码,@Retry触发器是基于microprofile库的。

例子:

  @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
      }
    };
  }

我试图找到解决方案的时间比我想承认的要长,但我仍然不知所措。有没有办法在一个范围内抛出异常,最终在另一个范围内?还有其他解决办法吗?

【问题讨论】:

    标签: java java-ee-6 grpc-java microprofile


    【解决方案1】:

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

    • 至少收到一个 onNext 更新,然后完成或出错
    • 收到的 onCompleted 有或没有任何更新

    一旦您定义了“成功”规则,您就可以将订阅包装到 Future 中并等待它通过提供的超时来解决。如果未解决,则从原始调用中抛出异常。

    【讨论】:

      猜你喜欢
      • 2016-07-28
      • 2022-09-28
      • 2022-01-09
      • 2012-01-11
      • 2014-04-03
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      相关资源
      最近更新 更多