如何在Spring应用程序结束时执行操作?

时间:2017-05-10 15:19:04

标签: java spring

我对Spring框架并不是这样,我有以下问题。

我正在实现一个简单的控制台应用程序(它是一个从数据库中获取一些数据并对外部Web服务执行一些调用的批处理)。

当应用程序启动时,它会在执行的.jar文件所在的同一文件夹中创建一个锁定文件。

我的问题是:当应用程序结束时,必须删除此锁定文件。

必须在应用程序成功终止或终止错误时执行此操作。

我在Java中读到我可以使用 ShutdownHook ,但我想也许春天为我提供了一些更简洁的方法。

所以基本上我有这样的情况:

public class MainApp {

    public static void main(String[] args) {

        try {
            checkIfRunning();
        } catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        try {
            new MainApp().execute();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 

    }

    private void execute() throws InterruptedException {

        System.out.println("Trigger BATCH START");

        //TimeUnit.SECONDS.sleep(150);

        GenericXmlApplicationContext context = new GenericXmlApplicationContext();
        context.load("applicationContext.xml");
        context.refresh();

        System.out.println("OBTAINED CONTEXT");
        System.out.println("Trigger BATCH END");

    }

    /**
     * Check if the Trigger batch is alread running:
     * @throws FileNotFoundException 
     */
    private static void checkIfRunning() throws FileNotFoundException {

        System.out.println("checkIfRunning() START");

        File f = new File(System.getProperty("user.dir") + "/lock.txt");

        if(f.exists() && !f.isDirectory()) { 
            System.out.println("Lock file exists !!!");
        }
        else {
            File file = new File(System.getProperty("user.dir") + "/lock.txt");
            FileOutputStream fos = new FileOutputStream(file);  
        }

    }
}

如何正确拦截与应用程序终止相关的事件以执行我的锁定文件的删除?

应用程序可以终止,因为:

  • 已完成执行。
  • 用户按CTRL + C并退出。
  • 发生异常并终止。

使用Spring实现它的智能方法是什么?

1 个答案:

答案 0 :(得分:-1)

由于文件创建发生在Spring之外,因此我会在Spring之外将其删除以保持一致性。

您可以添加关机挂钩:

try {
    checkIfRunning();
} catch (FileNotFoundException e1) {
    e1.printStackTrace();
} finally {
    Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
            System.out.println("Deleting the lock file...");
            // TODO: call a function to delete the lock file if it exists
            System.out.println("Lock file delete");
        }
    });
}

根据文件:addShutdownHook(Thread hook)

  

Java虚拟机关闭以响应两种事件:

     
      
  • 当最后一个非守护程序线程退出或调用退出(等效,System.exit)方法时,程序正常退出,或者
  •   
  • 虚拟机将终止以响应用户中断,例如键入^ C或系统范围的事件,例如用户注销或系统关闭。
  •