feat(Java_SpringExample): 增加Servlet监听器启动Schedule定时任务(SchemeTaskListener)
This commit is contained in:
@@ -6,4 +6,6 @@
|
||||
2020/5/26 : AspectJ代码提交,代码报错未解决
|
||||
|
||||
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;
|
||||
|
||||
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>
|
||||
@@ -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};
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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