Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Error handling 谁能给我解释一下';gRPC StreamObserver.onError的正确用法是什么?_Error Handling_Grpc Java - Fatal编程技术网

Error handling 谁能给我解释一下';gRPC StreamObserver.onError的正确用法是什么?

Error handling 谁能给我解释一下';gRPC StreamObserver.onError的正确用法是什么?,error-handling,grpc-java,Error Handling,Grpc Java,我正在尝试正确处理gRPC错误(Java、Spring boot应用程序) 基本上,我也需要将错误详细信息从gRPC服务器传输到客户端,但我发现很难理解StreamObserver.onError()的正确用法 方法文件说: “从流接收终止错误。只能调用一次。” 如果调用,它必须是最后一个调用的方法 异常由onError的实现引发,无需进一步调用 “任何方法都允许。” “不允许再打电话”是什么意思?在我维护的应用程序中,他们调用了其他gRPC方法,得到了java.lang.IllegalStat

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

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

方法文件说:

“从流接收终止错误。只能调用一次。” 如果调用,它必须是最后一个调用的方法 异常由onError的实现引发,无需进一步调用 “任何方法都允许。”

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

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

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

涉及两个
StreamObserver
实例。一个用于入站方向,即您实现并传递到gRPC库的
StreamObserver
实例。这是包含如何处理响应的逻辑的
StreamObserver
。另一个用于出站方向,即gRPC库在调用RPC方法时返回给您的
StreamObserver
实例。这是用于发送请求的
StreamObserver
。大多数情况下,这两个
StreamObserver
s相互作用(例如,在完全双工流调用中,响应
StreamObserver
通常调用请求
StreamObserver
onNext()
方法,这就是实现乒乓行为的方式)

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

例如:


公共类HelloWorld{
私人最终HelloWorldStub存根;
私人流动观察员;
...
私有void sendRequest(字符串消息){
requestObserver.onNext(HelloRequest.newBuilder.setMessage(message.build());
}
公开作废开始(){
stub.helloWorld(新StreamObserver){
@凌驾
public void onNext(Hello响应){
sendRequest(“客户你好”);
//或者,您可以在上调用onCompleted()或onError()
//requestObserver请求终止调用。
}
@凌驾
未完成的公共无效(){
//您不应该在requestObserver上调用任何方法。
}
@凌驾
公共无效onError(可丢弃错误){
//您不应该在requestObserver上调用任何方法。
}
});
}
}
它与
start()
方法无关

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

试试看{
requestObserver.onCompleted();
}捕获(运行时异常e){
requestObserver.onError();
}

它主要用于用户自己的
StreamObserver
实现<代码>StreamObserver由gRPC返回,从不抛出。

谢谢!这是一个很好的答案!请再详细说明一下-如果对出站观察者调用了
onError()
,则不应从出站观察者调用更多的gRPC方法,对吗?但是包装
outboundObserver.onError()
的方法的执行不会被
outboundObserver.onError()停止,否则应该停止(如使用
throw new RuntimeException()
)?我之所以这样问,是因为我有一个方法充满了
outboundObserver.onError()
,之后包含它们的方法不会终止。
outboundObserver.onError()
正在通知服务器一个错误,aka,向服务器发送一个错误并关闭RPC流。RPC调用已终止。它不会导致客户端发生任何事情,也不会影响应用程序代码。非常感谢,这是我需要知道的!