我有一个 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((",它会从所有记录中释放锁吗? 请帮助我。
您要实现的目标应该通过交易来完成。分批处理数据,例如 100 条记录,以免使事务太大,然后当执行器关闭时,事务将被回滚,并且所有记录级数据库锁将被释放。
shutdown()
方法将中断所有空闲的工作线程,您可以将清理代码放在中断句柄或 finally 块中。始终建议 清理 .如果你打电话给shutdownNow()
.它将中断所有工作线程。