자바 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);