feat(Java_SpringExample): 增加Servlet监听器启动Schedule定时任务(SchemeTaskListener)

This commit is contained in:
851516902@qq.com
2020-06-03 23:22:15 +08:00
parent c7be721cc2
commit 85144d8d2f
4 changed files with 117 additions and 8 deletions
+2
View File
@@ -7,3 +7,5 @@
2020/5/29 : 增加Properties文件字段读取两种方式(propertiesScan),PostConstruct的使用、BeanPostProcessor在Bean初始化前后进行处理(init)、统一异常处理的两种方式(exceptionHandler)、统一出参报文处理(response)
新增上下文刷新判断处理类(refreshEvent)、添加HttpSession监听器(listener
2020/6/3 :增加Servlet监听器启动Schedule定时任务(SchemeTaskListener
+11 -6
View File
@@ -1,17 +1,23 @@
package config;
import config.refreshEvent.ContextRefreshEvent;
import filter.FilterDelegator;
import filter.WelcomeHandlingFilter;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import javax.servlet.*;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.EventListener;
import java.util.List;
import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterRegistration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import config.refreshEvent.ContextRefreshEvent;
import filter.FilterDelegator;
import filter.WelcomeHandlingFilter;
/**
* Created by com on 2017/7/25.
* <p>
@@ -45,8 +51,7 @@ public class WebInitializer extends AbstractAnnotationConfigDispatcherServletIni
*/
@Override
protected Class<?>[] getRootConfigClasses() {
// return new Class<?>[]{ContextComponentLoder.class};
return new Class<?>[]{};
return new Class<?>[]{ContextComponentLoader.class};
}
@@ -0,0 +1,65 @@
package listener;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import listener.task.FileTimerTask;
/**
* 通过ServletContextListener监听器在Servlet容器初始化和销毁的时候进行处理
*
*  当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件,该事件由ServletContextListener 来处理。在 ServletContextListener
* 接口中定义了处理ServletContextEvent 事件的两个方法。
* @author 志军
*/
@WebListener
public class SchemeTaskListener implements ServletContextListener {
/**
* 当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后,容器再对Filter 初始化,
* 并且对那些在Web 应用启动时就需要被初始化的Servlet 进行初始化。
*/
@Override
public void contextInitialized(ServletContextEvent sce) {
//这边模仿处理一个文件定时删除的任务,当一个Servlet容器创建的时候会进行删除操作,就好像之前有接触过的数据库表配置初始化,大概类似这种的用法.
//ScheduledExecutorService
Timer timer = new Timer();
FileTimerTask fileTimerTask = new FileTimerTask(sce.getServletContext().getRealPath("/"));
//设置开始执行的时间
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 22);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Date date = calendar.getTime();
//Timer有四个schedule方法和两个scheduleAtFixedRate方法,好像前者的执行更实时,schedule方法分别对应单次执行和延迟多久后执行
timer.schedule(fileTimerTask, date);
//-----------------------------------这边是alibaba的校验规则检测出来的,用ScheduledExecutorService的方式来代替Timer处理会更好一点
//多线程并行处理定时任务时,Timer运行多个TimeTask时,只要其中之一没有捕获抛出的异常,其它任务便会自动终止运行,使用ScheduledExecutorService则没有这个问题。
//org.apache.commons.lang3.concurrent.BasicThreadFactory
ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1,
new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d").daemon(true).build());
executorService.scheduleAtFixedRate(fileTimerTask, 1000, 60 * 10, TimeUnit.HOURS);
}
/**
* 当Servlet 容器终止Web 应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet 和Filter 过滤器。
*/
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
}
@@ -0,0 +1,37 @@
/*
* Copyright (c) 2020.
*/
package listener.task;
import java.io.File;
import java.util.TimerTask;
/**
* 这是一个文件的TimerTask,需要继承TimerTask并实现执行方法(Run
* @author 志军
*/
public class FileTimerTask extends TimerTask {
private String path;
public FileTimerTask() {
}
public FileTimerTask(String path) {
this.path = path;
}
@Override
public void run() {
System.out.println("文件管理开始=========");
path = path + System.getProperty("file.separator") + "pdf";
System.out.println("path" + path);
File file = new File(path);
runTask(file);
}
private void runTask(File file) {
System.out.println("开始执行任务,要删除的文件名为" + (file.exists() ? file.getName() : "我是不存在的"));
}
}