有人可以向我解释 gRPC StreamObserver.onError 的正确用法是什么吗?

gai*_*jin 6 error-handling grpc-java

我正在尝试正确处理 gRPC 错误(Java、Spring-boot 应用程序)。

基本上,我也需要将错误详细信息从 gRPC 服务器传输到客户端,但我发现很难理解 的正确用法StreamObserver.onError();

方法文档说:

“从流中接收到终止错误。只能调用一次,如果调用,则必须是最后调用的方法。特别是,如果 onError 的实现引发异常,则不允许进一步调用任何方法。”

“不允许再打电话”是什么意思?在我维护的应用程序中,他们调用其他 gRPC 方法,并且java.lang.IllegalStateException: call already closed根据文档,他们得到了很好的结果。

我想知道 - 我(开发人员)应该在收到错误后终止当前的 java 方法(通常使用 gRPC 调用)吗?例如抛出异常来停止执行。或者预计 gRPC 将终止执行..(类似于从 gRPC 抛出异常)

基本上我如何正确使用onError()以及如果我调用它我应该期待和处理什么?我需要解释一下它的用法和效果。

voi*_*zcy 10

涉及两个StreamObserver实例。一种是入站方向,这是您实现并传递给 gRPC 库的StreamObserver实例。这是包含如何处理响应的逻辑。另一个是outbound方向,就是gRPC库在调用RPC方法时返回给你的实例。这是您用来发送请求的。大多数时候,这两个相互交互(例如,在全双工流式调用中,响应通常调用请求的方法,这就是实现乒乓行为的方式)。StreamObserverStreamObserverStreamObserverStreamObserverStreamObserverStreamObserveronNext()

“不允许进一步调用”意味着当调用 inbound的方法时,您不应该再调用onNext(),onComplete()和/或onError() 在出站方向上StreamObserver,即使您的入站实现抛出异常。由于入站是异步调用的,因此它与包含 的实现的方法无关。StreamObserveronError()onError()StreamObserverStreamObserver

例如:


public class HelloWorld {
  private final HelloWorldStub stub;
  private StreamObserver<HelloRequest> requestObserver;

  ...

  private void sendRequest(String message) {
    requestObserver.onNext(HelloRequest.newBuilder.setMessage(message).build());
  }

  public void start() {
    stub.helloWorld(new StreamObserver<HelloResponse> {
      @Override
      public void onNext(HelloResponse response) {
        sendRequest("hello from client");
        // Optionally you can call onCompleted() or onError() on 
        // the requestObserver to terminate the call.
      }

      @Override
      public void onCompleted() {
        // You should not call any method on requestObserver.
      }

      @Override
      public void onError(Throwable error) {
        // You should not call any method on requestObserver.
      }
    });
  }

}

Run Code Online (Sandbox Code Playgroud)

和方法没有关系start()

该医生还提到你不应该做类似的事情

try {
  requestObserver.onCompleted();
} catch(RuntimeException e) {
  requestObserver.onError();
}
Run Code Online (Sandbox Code Playgroud)

它主要用于用户自己的StreamObserver实现。StreamObservergRPC 返回的 永远不会抛出异常。

  • `outboundObserver.onError()` 正在通知服务器一个错误,也就是向服务器发送一个错误并关闭 RPC 流。_RPC 调用_ 终止。它不会导致客户端发生任何事情,也不会影响应用程序代码。 (2认同)