我的应用程序停止时该如何捕捉?

时间:2019-09-17 12:42:30

标签: java spring spring-boot quartz-scheduler quartz

我有一个spring-boot应用程序,并且我使用石英来创建作业。我像运行我的应用程序 ./ bin / app启动 当我的应用程序停止时,我需要赶上实现Job的类: ./ bin /应用停止 有人知道我该怎么做吗? 我尝试使用方法DisposableBean实现destroy(),但是不起作用。 我的主要班级是这样的:

public class Main implements CommandLineRunner {
    public static void main(String[] args) throws Exception {
       .....

Quartz创建作业,并在我的作业中创建一个变量“ lock”,如下所示:

public class MyJob implements Job, DisposableBean {
private RLock lock = redissonClient.getFairLock(jobName);
    .....

    @Override
    public void destroy() throws Exception {
        if(lock != null) {
            lock.forceUnlock();
        }
    }

当我的应用程序在执行过程中停止时,我需要强制解锁,因此我需要在MyJob类而不是Main类中捕获停止。 先感谢您!!

2 个答案:

答案 0 :(得分:0)

您应该能够将事件观察器附加到应用程序上下文,例如:

  public class MyJob implements Job, DisposableBean {

      public MyJob(ApplicationContext context) {
        ((ConfigurableApplicationContext)context).addApplicationListener(
           (ContextClosedEvent event) -> onContextClosed()
        );
      }

      private void onContextClosed() {
         ...
      }
  }

答案 1 :(得分:0)

使用db.a.aggregate([ {$limit:1000}, {$lookup: { from: "werkstuecke", localField: "_id", foreignField: "AuftragsID", as:"test" }}, // here may has other operation like $unwind {$limit:1000} ]).pretty() 批注。用@PreDestroy注释要在停止时执行的方法。

@PreDestroy