我有一个spring-boot应用程序,我在其中使用 ScheduledExecutorService 来创建单线程执行程序。在这个单线程中,我处理数据库记录。我获取了许多记录的锁定来处理它们,并希望在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 :(得分:0)
在我看来,你想要实现的目标应该是通过交易完成的。分批处理数据说100条记录不会使事务太大,然后当执行程序关闭时,事务将被回滚,所有记录级别的数据库锁将被释放。
答案 1 :(得分:0)
shutdown()
方法将中断所有空闲工作程序,你可以将清理代码放在中断句柄或最终块中。总是建议清理。如果你调用shutdownNow()
。它会中断所有工人线程。