Java gRPCサーバースレッドは、DEADLINE時間後もまだ実行されています。
正しいです。 Javaは本当の選択肢を提供していません。
しかし、gRPCサーバーは、DEADLINE時間が経過して以来、後続のgRPC呼び出しを行わないようにそのスレッドを停止/ブロックしますか?
大部分です。発信gRPC呼び出しでは、io.grpc.Context
が表示されます。これは、期限切れと取り消しが伝播することを意味します(Contextを別のスレッドに伝播しないか、Context.fork()
を使用しない限り)。
上記の記述が正しい場合、DEADLINE時間が経過したRedis/DB呼び出しもスレッドを停止/ブロックする方法がありますか?または、DEADLINE時間が過ぎると、スレッドを即座に中断しますか?
Context.addListener()
でコンテキストキャンセルを聞くことができます。期限が切れ、クライアントがRPCをキャンセルした場合、gRPCサーバはコンテキストをキャンセルします。この通知は、発信RPCがどのように取り消されるかを示します。
スレッド中断は、レースなしで実行するには少し関係があります。中断したい場合はFuture
が既に存在しない場合は、の実装を取得するために、FutureTask
で作業内容をラップして(現在のスレッドでFutureTask.run()
を呼び出してください)、お勧めします。
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);