2017-11-27 29 views
1

Java gRPCサーバースレッドは、DEADLINE時間後もまだ実行されています。しかし、gRPCサーバーは、DEADLINE時間が経過して以来、後続のgRPC呼び出しを行わないようにそのスレッドを停止/ブロックしますか?gRPCサーバーはすぐにDEADLINE_EXCEEDEDスレッドを回収できますか?

上記の記述が正しい場合、DEADLINE時間が経過したRedis/DB呼び出しもスレッドを停止/ブロックする方法がありますか?または、DEADLINE時間が過ぎると、スレッドを即座に中断しますか?

答えて

1

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); 
関連する問題