2017-06-12 21 views
0

私は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()"を呼び出すだけで知りたければ、すべてのレコードからロックを解放しますか?私を助けてください。

+0

あなたの問題は何ですか? – dunni

+0

質問を編集しました。 – rishi

答えて

0

私はあなたが達成しようとしているものは、トランザクションで行う必要があります。 100個のレコードをバッチ処理してトランザクションを大きくしないと、エグゼキュータがシャットダウンされるとトランザクションがロールバックされ、レコードレベルのdbロックがすべて解放されます。

0

shutdown()メソッドはすべてのアイドルワーカーを中断し、割り込みハンドルまたは最終的にブロックにクリーンアップコードを入れることができます。shutdownNow()を呼び出すと、すべてのワーカースレッドが中断されます。

関連する問題