通过java 反射获取spring中加了@Scheduled() 的定时任务

@RestController
@RequestMapping("/task")
public class TaskController {

    @Autowired
    ThreadPoolTaskScheduler threadPoolTaskScheduler; //这是spring默认的 定时任务执行器  里面有个Executor 就是一个定时任务具体的执行器,是个AQS队列

    @RequestMapping("/list")
    public JSONArray getTaskList(HttpServletRequest request, HttpServletResponse response)throws Exception{
        BlockingQueue<Runnable> queue =threadPoolTaskScheduler.getScheduledThreadPoolExecutor().getQueue();//获取AQS队列,里面有我们所有的定时任务
        JSONArray tasklist=new JSONArray();
        Iterator<Runnable> iterator = queue.iterator();//循环取出定时任务
        while (iterator.hasNext()){
            Runnable runnable = iterator.next();//虽然是个Runnable对象 ,但是通过反射,可以获取更多的内容。(这里多亏了idea  可以调试查看对象的class信息)
            Field field = runnable.getClass().getSuperclass().getDeclaredField("callable");
            field.setAccessible(true);
            Object o1 = field.get(runnable);
            Class<?> aClass = Class.forName("java.util.concurrent.Executors$RunnableAdapter");//这个RunnableAdapter 是个Executors的内部类,修饰符static final class。所以使用了forName的方法是获取class对象 
            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));
            tasklist.add(data);
        }
        return tasklist;
    }
}

idea yes eclipse no

posted @ 2019-11-12 14:18  你还未发现  阅读(838)  评论(0编辑  收藏  举报