feat(Java_SpringExample): 增加Servlet监听器启动Schedule定时任务(SchemeTaskListener)
This commit is contained in:
@@ -7,3 +7,5 @@
|
|||||||
|
|
||||||
2020/5/29 : 增加Properties文件字段读取两种方式(propertiesScan),PostConstruct的使用、BeanPostProcessor在Bean初始化前后进行处理(init)、统一异常处理的两种方式(exceptionHandler)、统一出参报文处理(response)
|
2020/5/29 : 增加Properties文件字段读取两种方式(propertiesScan),PostConstruct的使用、BeanPostProcessor在Bean初始化前后进行处理(init)、统一异常处理的两种方式(exceptionHandler)、统一出参报文处理(response)
|
||||||
新增上下文刷新判断处理类(refreshEvent)、添加HttpSession监听器(listener)
|
新增上下文刷新判断处理类(refreshEvent)、添加HttpSession监听器(listener)
|
||||||
|
|
||||||
|
2020/6/3 :增加Servlet监听器启动Schedule定时任务(SchemeTaskListener)
|
||||||
@@ -1,17 +1,23 @@
|
|||||||
package config;
|
package config;
|
||||||
|
|
||||||
import config.refreshEvent.ContextRefreshEvent;
|
|
||||||
import filter.FilterDelegator;
|
|
||||||
import filter.WelcomeHandlingFilter;
|
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
|
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
|
||||||
|
|
||||||
import javax.servlet.*;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.EventListener;
|
import java.util.EventListener;
|
||||||
import java.util.List;
|
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.
|
* Created by com on 2017/7/25.
|
||||||
* <p>
|
* <p>
|
||||||
@@ -45,8 +51,7 @@ public class WebInitializer extends AbstractAnnotationConfigDispatcherServletIni
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected Class<?>[] getRootConfigClasses() {
|
protected Class<?>[] getRootConfigClasses() {
|
||||||
// return new Class<?>[]{ContextComponentLoder.class};
|
return new Class<?>[]{ContextComponentLoader.class};
|
||||||
return new 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() : "我是不存在的"));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user