diff --git a/Readme.md b/Readme.md index dc11418..75c0974 100644 --- a/Readme.md +++ b/Readme.md @@ -6,4 +6,6 @@ 2020/5/26 : AspectJ代码提交,代码报错未解决 2020/5/29 : 增加Properties文件字段读取两种方式(propertiesScan),PostConstruct的使用、BeanPostProcessor在Bean初始化前后进行处理(init)、统一异常处理的两种方式(exceptionHandler)、统一出参报文处理(response) -新增上下文刷新判断处理类(refreshEvent)、添加HttpSession监听器(listener) \ No newline at end of file +新增上下文刷新判断处理类(refreshEvent)、添加HttpSession监听器(listener) + +2020/6/3 :增加Servlet监听器启动Schedule定时任务(SchemeTaskListener) \ No newline at end of file diff --git a/src/main/java/config/WebInitializer.java b/src/main/java/config/WebInitializer.java index fa73292..9a6480e 100644 --- a/src/main/java/config/WebInitializer.java +++ b/src/main/java/config/WebInitializer.java @@ -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. *

@@ -36,7 +42,7 @@ public class WebInitializer extends AbstractAnnotationConfigDispatcherServletIni registerListeners(servletContext); //刷新事件需要作为监听器在这边配置 ContextRefreshEvent refreshEvent = new ContextRefreshEvent(); - servletContext.addListener(refreshEvent.getClass()); + servletContext.addListener(refreshEvent.getClass()); } @@ -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}; } diff --git a/src/main/java/listener/SchemeTaskListener.java b/src/main/java/listener/SchemeTaskListener.java new file mode 100644 index 0000000..b0dd423 --- /dev/null +++ b/src/main/java/listener/SchemeTaskListener.java @@ -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) { + + } +} diff --git a/src/main/java/listener/task/FileTimerTask.java b/src/main/java/listener/task/FileTimerTask.java new file mode 100644 index 0000000..c300e3e --- /dev/null +++ b/src/main/java/listener/task/FileTimerTask.java @@ -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() : "我是不存在的")); + } +}