[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