[GRPC] 3. GRPC 를 사용해보면서... #1

Server 에서 구현체를 만들지 않으면?

  • client 에서 io.grpc.StatusRuntimeException 가 발생함.
import io.grpc.stub.StreamObserver;

public class HelloWorldServiceImpl extends HelloWorldServiceGrpc.HelloWorldServiceImplBase {

	@Override
	public void sayHello(HelloRequest request, StreamObserver<HelloResponse> responseObserver) {
		System.out.println("request : " + request.getName());
		responseObserver.onNext(HelloResponse.newBuilder().setMessage("안녕하세요.").build());
		responseObserver.onCompleted();
	}
}

enum 의 default value

  • 첫번째로 선언한 value(0으로 선언한 값)가 default 로 사용됨.

응답에 대한 상태값 처리

  • http 에는 http status 로 200, 400, 500 등으로 상태값을 나타냄.
  • https://grpc.github.io/grpc/core/md_doc_statuscodes.html 에서 보니 정의된 값이 있다.
  • grpc-java 에서는?
    • io.grpc.Status 를 보면 알 수 있음.
    • https://github.com/grpc/grpc-java/blob/dd0db6cf41df21965bb7c0f166cdf279c31290ad/api/src/main/java/io/grpc/Status.java#L56

onCompleted 관련

onError 호출시에는 onCompleted 를 호출 안해줘도 됨.

  • 아래와 같이 finally 에서 onCompleted 를 호출하도록 해놨을 때, 실제 호출하게 되면 java.lang.IllegalStateException: call already closed 가 발생한다.
try {
    if (true) {
        throw IllegalArgumentException()
    }
    
    responseObserver.onNext(....)
    
} catch (e : Exception){
    responseObserver.onError(....)
} finally {
    responseObserver.onCompleted()
}
  • 아래와 같이 수정하면 발생하지 않는다.
try {
    if (true) {
        throw IllegalArgumentException()
    }
    
    responseObserver.onNext(....)
    responseObserver.onCompleted()

} catch (e : Exception){
    responseObserver.onError(....)
} 

server 에서 onCompleted 를 호출 안할 경우…

  • Client 및 Server 에서 deadline 이 넘어 CANCELLED 가 발생 합니다.
    • 각 언어마다 deadline 설정 안되어 있을 수 있습니다. (java 는 되어있는듯… 몇초인지는 안찾아봄.)
  • Server Error

io.grpc.StatusException: CANCELLED: Request timed out

  • Client Error

io.grpc.StatusRuntimeException: CANCELLED: Request timed out


Related Posts