需求:获取项目中所有使用spring的@Scheduled注解的定时任务相关信息
思路:从IOC容器中获取ThreadPoolTaskScheduler实例,遍历所有定时任务,反射得到定时任务相关信息(哪个包下面的哪个类的哪个方法)
实现:
<%@ page import="org.springframework.web.context.support.WebApplicationContextUtils" %>
<%@ page import="org.springframework.web.context.WebApplicationContext" %>
<%@ page import="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler" %>
<%@ page import="java.lang.reflect.Field" %>
<%@ page import="org.springframework.scheduling.support.DelegatingErrorHandlingRunnable" %>
<%@ page import="org.springframework.scheduling.support.ScheduledMethodRunnable" %>
<%@ page import="net.sf.json.JSONObject" %>
<%@ page import="java.lang.reflect.Method" %>
<%@ page import="java.util.Iterator" %>
<%@ page import="java.util.concurrent.BlockingQueue" %>
<%@ page import="org.springframework.beans.BeansException" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>scheduler</title>
</head>
<body>
<%
try {
WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(application);
ThreadPoolTaskScheduler bean = new ThreadPoolTaskScheduler();
try {
bean = (ThreadPoolTaskScheduler) webApplicationContext.getBean("myScheduler");
} catch (BeansException e) {
try {
bean = (ThreadPoolTaskScheduler) webApplicationContext.getBean("defaultSockJsTaskScheduler");
} catch (BeansException beansException) {
bean = (ThreadPoolTaskScheduler) webApplicationContext.getBean("taskScheduler");
}
}
BlockingQueue<Runnable> queue = bean.getScheduledThreadPoolExecutor().getQueue();
Iterator<Runnable> iterator = queue.iterator();//循环取出定时任务
while (iterator.hasNext()){
Runnable runnable = iterator.next();
Field field = runnable.getClass().getSuperclass().getDeclaredField("callable");
field.setAccessible(true);
Object o1 = field.get(runnable);
Class<?> aClass = Class.forName("java.util.concurrent.Executors$RunnableAdapter");
Field taskField = aClass.getDeclaredField("task");
taskField.setAccessible(true);
Object o2 = taskField.get(o1);
Class o2Class = o2.getClass();
Field delegateField;
if (o2Class.equals( DelegatingErrorHandlingRunnable.class)){
delegateField= o2Class.getDeclaredField("delegate");
delegateField.setAccessible(true);
}else{
delegateField = o2Class.getSuperclass().getDeclaredField("delegate");
delegateField.setAccessible(true);
}
ScheduledMethodRunnable scheduledMethodRunnable=(ScheduledMethodRunnable)delegateField.get(o2);
Method method = scheduledMethodRunnable.getMethod();
JSONObject data=new JSONObject();
data.put("ScheduleClassName",method.getDeclaringClass().getName());
data.put("ScheduleMethodName",method.getName());
data.put("status", JSONObject.fromObject(runnable));
System.out.println(data);
out.println(data);
}
} catch (Exception e) {
e.printStackTrace();
}
%>
</body>
</html>