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 返回的 永远不会抛出异常。
| 归档时间: |
|
| 查看次数: |
15313 次 |
| 最近记录: |