Browse Source

确保应用退出时能关闭后台线程

cj 6 years ago
parent
commit
4fa795dee9

+ 49 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationShutdownBean.java

@@ -0,0 +1,49 @@
+package com.ruoyi.framework.config;
+
+import com.ruoyi.framework.manager.AsyncManager;
+import com.ruoyi.framework.shiro.web.session.SpringSessionValidationScheduler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PreDestroy;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * AsyncManagerShutdownBean 类
+ *
+ * @Auther: cj
+ * @Date: 2018/12/28
+ */
+@Component
+public class ApplicationShutdownBean {
+    private static final Logger logger = LoggerFactory.getLogger("sys-user");
+
+    @Autowired(required = false)
+    private SpringSessionValidationScheduler springSessionValidationScheduler;
+
+    @PreDestroy
+    public void destroy(){
+        shutdownSpringSessionValidationScheduler();
+        shutdownAsyncManager();
+    }
+
+    private void shutdownSpringSessionValidationScheduler(){
+        if(springSessionValidationScheduler != null && springSessionValidationScheduler.isEnabled())
+        try {
+            logger.info("关闭会话验证任务");
+            springSessionValidationScheduler.disableSessionValidation();
+        } catch (Exception e) {
+            logger.error(e.getMessage(),e);
+        }
+    }
+    private void shutdownAsyncManager(){
+        try {
+            logger.info("关闭后台任务线程池");
+            AsyncManager.me().shutdown(10, TimeUnit.SECONDS);
+        } catch (Exception e) {
+            logger.error(e.getMessage(),e);
+        }
+    }
+}

+ 6 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java

@@ -40,4 +40,10 @@ public class AsyncManager
     {
         executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS);
     }
+
+    public void shutdown(long timeout, TimeUnit unit) throws Exception
+    {
+        executor.shutdown();
+        executor.awaitTermination(timeout,unit);
+    }
 }

+ 8 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/session/SpringSessionValidationScheduler.java

@@ -134,6 +134,14 @@ public class SpringSessionValidationScheduler implements SessionValidationSchedu
             log.debug("Stopping Spring Scheduler session validation job...");
         }
 
+        if(this.enabled){
+            executorService.shutdown();
+            try {
+                executorService.awaitTermination(10,TimeUnit.SECONDS);
+            } catch (InterruptedException e) {
+                log.error(e.getMessage(),e);
+            }
+        }
         this.enabled = false;
     }
 }