私はScheduledExecutorServiceを使用してシングルスレッドエグゼキュータを作成するスプリングブートアプリケーションを持っています。この1つのスレッドでは、データベースレコードを処理します。私はそれらを処理するために多くのレコードをロックし、JVMがシャットダウンされるとすぐにロックを解除したいと考えています。 JVMのシャットダウンフックを登録しようとしました。シャットダウン時にリソースを解放する
// Create single threaded
ScheduledExecutorService executor;= Executors.newSingleThreadScheduledExecutor();
executor.scheduleWithFixedDelay(dbRecordProcessor, 1000, delay, TimeUnit.MILLISECONDS);
// Registering shutdown hook
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
logger.info("Executing shutdown hook.....");
executor.shutdown();
}
});
//
DbRecordProcessor implements Runnable {
public void run() {
try {
// get all the records from DB by acquiring lock
}catch(Exception e) {
}finally {
// Release the lock on record
}
// Acquire lock on records
// loop on them
// Process them
// Release the lock after processing
}
}
私が欲しいのは、JVMのシャットダウンフックが呼び出されると、ロックが取得されたすべてのレコードが解放されなければなりません。レコードの一部が別のインスタンスによってロックされる可能性があるので、私は盲目的にすべてのレコードの「ロックを解除」することはできません。したがって、この実行中のインスタンスによってロックされているレコードのみをロック解除します。 "executor.shutdown()"を呼び出すだけで知りたければ、すべてのレコードからロックを解放しますか?私を助けてください。
あなたの問題は何ですか? – dunni
質問を編集しました。 – rishi