关机时释放资源



我有一个 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().它将中断所有工作线程。

相关内容

  • 没有找到相关文章

最新更新