2017-11-27 32 views
1

자바 gRPC 서버 스레드는 DEADLINE 시간 후에도 계속 실행됩니다. 하지만, gRPC 서버는 DEADLINE 시간이 지나간 이후에 그 쓰레드가 이후의 gRPC 호출을 멈추거나 막을 수 있습니까?gRPC 서버가 DEADLINE_EXCEEDED 스레드를 즉시 회수 할 수 있습니까?

위가 올바른 문장 인 경우, 어떤 레디 스/DB를 만드는 스레드뿐만 아니라 교차시킨 마감일 시간을 요구 차단/정지하는 방법이 있나요? 또는 DEADLINE 시간이 지나면 즉시 스레드를 인터럽트합니까?

답변

1

자바 gRPC 서버 스레드는 여전히 DEADLINE 시간 후에도 실행됩니다.

수정. Java는 실제 대안을 제공하지 않습니다.

그러나 gRPC 서버는 DEADLINE 시간이 초과되어 이후의 gRPC 호출을 중지하거나 차단합니다.

대부분. 발신 gRPC 호출은 io.grpc.Context을 준수합니다. 즉, 마감 시간을 의미하고 취소가 전달됩니다 (다른 스레드에 컨텍스트를 전달하지 못하거나 Context.fork()을 사용하지 않는 한).

위의 내용이 올바른 경우, DEADLINE 시간이 경과 한 Redis/DB 호출을 만드는 스레드를 중지/차단하는 방법이 있습니까? 또는 DEADLINE 시간이 지나면 즉시 스레드를 인터럽트합니까?

Context.addListener()을 통해 컨텍스트 취소를 청취 할 수 있습니다. 마감일이 만료되고 클라이언트가 RPC를 취소하면 gRPC 서버는 컨텍스트를 취소합니다. 이 알림은 나가는 RPC가 취소되는 방법입니다.

는 그 스레드 중단 경주없이 수행 할 참여 약간입니다주의 할 것이다. 당신이 중단을 원하고 이미 Future이없는 경우, 나는 FutureTask에서 작업 포장 (단순히 현재의 thread에 FutureTask.run()를 호출)의 비 정확성 cancel(true) 구현을 얻기 위해 좋습니다.

final FutureTask<Void> future = new FutureTask<Void>(work, null); 
Context current = Context.current(); 
CancellationListener listener = new CancellationListener() { 
    @Override public void cancelled(Context context) { 
    future.cancel(true); 
    } 
}; 
current.addListener(listener); 
future.run(); 
current.removeListener(listener);