2017-06-12 113 views
0

我有一个弹簧启动应用程序,我使用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

那么究竟是什么问题或问题? – dunni

+0

编辑了这个问题。 – rishi

回答

0

在我看来,你正在努力实现的交易应该完成。批量处理数据100记录不会使事务过大,然后当执行器关闭时,事务将被回滚并且所有记录级数据库锁将被释放。

0

shutdown()方法将中断所有空闲工作,并且可以将清理代码放在中断句柄或finally块中。总是建议清理。如果调用shutdownNow()。它将中断所有工作线程。