scheduler.jsp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. <%@page contentType="text/html;charset=UTF-8"%>
  2. <%@page import="java.lang.reflect.*"%>
  3. <%@page import="java.text.*"%>
  4. <%@page import="java.util.*"%>
  5. <%@page import="java.util.concurrent.*"%>
  6. <%@page import="org.springframework.context.ApplicationContext"%>
  7. <%@page import="org.springframework.web.context.support.WebApplicationContextUtils"%>
  8. <%@page import="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor"%>
  9. <%@page import="org.springframework.scheduling.config.ScheduledTaskRegistrar"%>
  10. <%@page import="org.springframework.scheduling.config.CronTask"%>
  11. <%@page import="org.springframework.scheduling.config.TriggerTask"%>
  12. <%@page import="org.springframework.scheduling.config.IntervalTask"%>
  13. <%@page import="org.springframework.scheduling.config.Task"%>
  14. <%@page import="org.springframework.scheduling.support.ScheduledMethodRunnable"%>
  15. <%@page import="org.springframework.scheduling.support.DelegatingErrorHandlingRunnable"%>
  16. <%@page import="org.springframework.scheduling.TaskScheduler"%>
  17. <%!
  18. Object forceGetField(Object instance, String fieldName) throws Exception {
  19. return forceGetField(instance.getClass(), instance, fieldName);
  20. }
  21. Object forceGetField(Class clz, Object instance, String fieldName) throws Exception {
  22. Field field = clz.getDeclaredField(fieldName);
  23. field.setAccessible(true);
  24. return field.get(instance);
  25. }
  26. Runnable findRunnable(Object instance) throws Exception {
  27. Runnable runnable = null;
  28. if (instance instanceof FutureTask) {
  29. Callable callable = null;
  30. try {
  31. // jdk6是这样,jdk7不要获得sync,直接反射callable
  32. Object sync = forceGetField(FutureTask.class, instance, "sync");
  33. callable = (Callable) forceGetField(sync, "callable");
  34. } catch(Exception ex) {
  35. // jdk7直接反射callable
  36. callable = (Callable) forceGetField(FutureTask.class, instance, "callable");
  37. }
  38. runnable = (Runnable) forceGetField(callable, "task");
  39. instance = runnable;
  40. }
  41. if (instance instanceof DelegatingErrorHandlingRunnable) {
  42. runnable = (Runnable) forceGetField(DelegatingErrorHandlingRunnable.class, instance, "delegate");
  43. }
  44. return runnable;
  45. }
  46. Object findInstance(Runnable runnable) {
  47. if (runnable instanceof ScheduledMethodRunnable) {
  48. ScheduledMethodRunnable scheduledMethodRunnable = (ScheduledMethodRunnable) runnable;
  49. Method method = scheduledMethodRunnable.getMethod();
  50. Class clz = method.getDeclaringClass();
  51. return clz.getCanonicalName() + "." + method.getName();
  52. } else {
  53. return runnable;
  54. }
  55. }
  56. Task findTask(ScheduledTaskRegistrar scheduledTaskRegistrar, Runnable runnable) throws Exception {
  57. List<Task> tasks = null;
  58. tasks = (List<Task>) forceGetField(scheduledTaskRegistrar, "triggerTasks");
  59. if (tasks != null) {
  60. for (Task task : tasks) {
  61. if (task.getRunnable() == runnable) {
  62. return task;
  63. }
  64. }
  65. }
  66. tasks = (List<Task>) forceGetField(scheduledTaskRegistrar, "cronTasks");
  67. if (tasks != null) {
  68. for (Task task : tasks) {
  69. if (task.getRunnable() == runnable) {
  70. return task;
  71. }
  72. }
  73. }
  74. tasks = (List<Task>) forceGetField(scheduledTaskRegistrar, "fixedRateTasks");
  75. if (tasks != null) {
  76. for (Task task : tasks) {
  77. if (task.getRunnable() == runnable) {
  78. return task;
  79. }
  80. }
  81. }
  82. tasks = (List<Task>) forceGetField(scheduledTaskRegistrar, "fixedDelayTasks");
  83. if (tasks != null) {
  84. for (Task task : tasks) {
  85. if (task.getRunnable() == runnable) {
  86. return task;
  87. }
  88. }
  89. }
  90. return null;
  91. }
  92. boolean isFixedRate(ScheduledTaskRegistrar scheduledTaskRegistrar, Task task) throws Exception {
  93. List<Task> tasks = (List<Task>) forceGetField(scheduledTaskRegistrar, "fixedRateTasks");
  94. return tasks.contains(task);
  95. }
  96. void scheduleTask(ScheduledTaskRegistrar scheduledTaskRegistrar, Set<ScheduledFuture<?>> scheduledFutures, Task task) throws Exception {
  97. if (task instanceof TriggerTask) {
  98. TriggerTask triggerTask = (TriggerTask) task;
  99. scheduledFutures.add(scheduledTaskRegistrar.getScheduler().schedule(
  100. triggerTask.getRunnable(), triggerTask.getTrigger()));
  101. } else if (task instanceof CronTask) {
  102. CronTask cronTask = (CronTask) task;
  103. scheduledFutures.add(scheduledTaskRegistrar.getScheduler().schedule(
  104. cronTask.getRunnable(), cronTask.getTrigger()));
  105. } else if (task instanceof IntervalTask) {
  106. IntervalTask intervalTask = (IntervalTask) task;
  107. long now = System.currentTimeMillis();
  108. TaskScheduler taskScheduler = scheduledTaskRegistrar.getScheduler();
  109. if (isFixedRate(scheduledTaskRegistrar, task)) {
  110. if (intervalTask.getInitialDelay() > 0) {
  111. Date startTime = new Date(now + intervalTask.getInitialDelay());
  112. scheduledFutures.add(taskScheduler.scheduleAtFixedRate(
  113. intervalTask.getRunnable(), startTime, intervalTask.getInterval()));
  114. } else {
  115. scheduledFutures.add(taskScheduler.scheduleAtFixedRate(
  116. intervalTask.getRunnable(), intervalTask.getInterval()));
  117. }
  118. } else {
  119. if (intervalTask.getInitialDelay() > 0) {
  120. Date startTime = new Date(now + intervalTask.getInitialDelay());
  121. scheduledFutures.add(taskScheduler.scheduleAtFixedRate(
  122. intervalTask.getRunnable(), startTime, intervalTask.getInterval()));
  123. } else {
  124. scheduledFutures.add(taskScheduler.scheduleAtFixedRate(
  125. intervalTask.getRunnable(), intervalTask.getInterval()));
  126. }
  127. }
  128. }
  129. }
  130. %>
  131. <%
  132. ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(application);
  133. ScheduledAnnotationBeanPostProcessor scheduledAnnotationBeanPostProcessor
  134. = (ScheduledAnnotationBeanPostProcessor) ctx.getBean(
  135. "org.springframework.context.annotation.internalScheduledAnnotationProcessor");
  136. ScheduledTaskRegistrar scheduledTaskRegistrar = (ScheduledTaskRegistrar)
  137. forceGetField(scheduledAnnotationBeanPostProcessor, "registrar");
  138. String action = request.getParameter("action");
  139. if ("execute".equals(action)) {
  140. String group = request.getParameter("group");
  141. int index = Integer.parseInt(request.getParameter("index"));
  142. List<Task> tasks = (List<Task>) forceGetField(scheduledTaskRegistrar, group);
  143. Task task = tasks.get(index);
  144. task.getRunnable().run();
  145. response.sendRedirect("scheduler.jsp");
  146. return;
  147. } else if ("cancel".equals(action)) {
  148. String group = request.getParameter("group");
  149. int index = Integer.parseInt(request.getParameter("index"));
  150. Set<ScheduledFuture<?>> scheduledFutures = (Set<ScheduledFuture<?>>) forceGetField(scheduledTaskRegistrar, "scheduledFutures");
  151. int i = 0;
  152. for (ScheduledFuture scheduledFuture : scheduledFutures) {
  153. if (i == index) {
  154. scheduledFuture.cancel(false);
  155. break;
  156. }
  157. i++;
  158. }
  159. response.sendRedirect("scheduler.jsp");
  160. return;
  161. } else if ("active".equals(action)) {
  162. String group = request.getParameter("group");
  163. int index = Integer.parseInt(request.getParameter("index"));
  164. Set<ScheduledFuture<?>> scheduledFutures = (Set<ScheduledFuture<?>>) forceGetField(scheduledTaskRegistrar, "scheduledFutures");
  165. int i = 0;
  166. ScheduledFuture future = null;
  167. for (ScheduledFuture scheduledFuture : scheduledFutures) {
  168. if (i == index) {
  169. future = scheduledFuture;
  170. break;
  171. }
  172. i++;
  173. }
  174. Runnable runnable = findRunnable(future);
  175. Task task = findTask(scheduledTaskRegistrar, runnable);
  176. scheduleTask(scheduledTaskRegistrar, scheduledFutures, task);
  177. scheduledFutures.remove(future);
  178. response.sendRedirect("scheduler.jsp");
  179. return;
  180. }
  181. %>
  182. <html>
  183. <head>
  184. <meta charset="utf-8">
  185. <title>scheduler</title>
  186. <style>
  187. tbody tr:nth-child(odd) td,
  188. tbody tr:nth-child(odd) th {
  189. background-color: #f9f9f9;
  190. }
  191. </style>
  192. </head>
  193. <body>
  194. <!-- ################################################## -->
  195. <h5>TriggerTask</h5>
  196. <table border="1">
  197. <thead>
  198. <tr>
  199. <th>runnable</th>
  200. <th>action</th>
  201. </tr>
  202. </thead>
  203. <tbody>
  204. <%
  205. // out.println(forceGetField(scheduledTaskRegistrar, "triggerTasks"));
  206. // out.println(forceGetField(scheduledTaskRegistrar, "cronTasks"));
  207. // out.println(forceGetField(scheduledTaskRegistrar, "fixedRateTasks"));
  208. // out.println(forceGetField(scheduledTaskRegistrar, "fixedDelayTasks"));
  209. List<TriggerTask> triggerTasks = (List<TriggerTask>) forceGetField(scheduledTaskRegistrar, "triggerTasks");
  210. if (triggerTasks != null) {
  211. int i = 0;
  212. for (TriggerTask triggerTask : triggerTasks) {
  213. pageContext.setAttribute("index", i);
  214. Runnable runnable = triggerTask.getRunnable();
  215. pageContext.setAttribute("instance", findInstance(runnable));
  216. pageContext.setAttribute("triggerTask", triggerTask);
  217. %>
  218. <tr>
  219. <td>${instance}</td>
  220. <td><a href="scheduler.jsp?action=execute&group=triggerTasks&index=${index}">execute</a></td>
  221. </tr>
  222. <%
  223. i++;
  224. }
  225. }
  226. %>
  227. </tbody>
  228. </table>
  229. <!-- ################################################## -->
  230. <h5>CronTask</h5>
  231. <table border="1">
  232. <thead>
  233. <tr>
  234. <th>runnable</th>
  235. <th>expression</th>
  236. <th>action</th>
  237. </tr>
  238. </thead>
  239. <tbody>
  240. <%
  241. List<CronTask> cronTasks = (List<CronTask>) forceGetField(scheduledTaskRegistrar, "cronTasks");
  242. if (cronTasks != null) {
  243. int i = 0;
  244. for (CronTask cronTask : cronTasks) {
  245. pageContext.setAttribute("index", i);
  246. Runnable runnable = cronTask.getRunnable();
  247. pageContext.setAttribute("instance", findInstance(runnable));
  248. ;
  249. pageContext.setAttribute("cronTask", cronTask);
  250. %>
  251. <tr>
  252. <td>${instance}</td>
  253. <td>${cronTask.expression}</td>
  254. <td><a href="scheduler.jsp?action=execute&group=cronTasks&index=${index}">execute</a></td>
  255. </tr>
  256. <%
  257. i++;
  258. }
  259. }
  260. %>
  261. </tbody>
  262. </table>
  263. <!-- ################################################## -->
  264. <h5>fixedRateTasks</h5>
  265. <table border="1">
  266. <thead>
  267. <tr>
  268. <th>runnable</th>
  269. <th>action</th>
  270. </tr>
  271. </thead>
  272. <tbody>
  273. <%
  274. List<IntervalTask> fixedRateTasks = (List<IntervalTask>) forceGetField(scheduledTaskRegistrar, "fixedRateTasks");
  275. if (fixedRateTasks != null) {
  276. int i = 0;
  277. for (IntervalTask fixedRateTask : fixedRateTasks) {
  278. pageContext.setAttribute("index", i);
  279. Runnable runnable = fixedRateTask.getRunnable();
  280. pageContext.setAttribute("instance", findInstance(runnable));
  281. ;
  282. pageContext.setAttribute("fixedRateTask", fixedRateTask);
  283. %>
  284. <tr>
  285. <td>${instance}</td>
  286. <td><a href="scheduler.jsp?action=execute&group=fixedRateTasks&index=${index}">execute</a></td>
  287. </tr>
  288. <%
  289. i++;
  290. }
  291. }
  292. %>
  293. </tbody>
  294. </table>
  295. <!-- ################################################## -->
  296. <h5>fixedDelayTasks</h5>
  297. <table border="1">
  298. <thead>
  299. <tr>
  300. <th>runnable</th>
  301. <th>action</th>
  302. </tr>
  303. </thead>
  304. <tbody>
  305. <%
  306. List<IntervalTask> fixedDelayTasks = (List<IntervalTask>) forceGetField(scheduledTaskRegistrar, "fixedDelayTasks");
  307. if (fixedDelayTasks != null) {
  308. int i = 0;
  309. for (IntervalTask fixedDelayTask : fixedDelayTasks) {
  310. pageContext.setAttribute("index", i);
  311. Runnable runnable = fixedDelayTask.getRunnable();
  312. pageContext.setAttribute("instance", findInstance(runnable));
  313. ;
  314. pageContext.setAttribute("fixedDelayTask", fixedDelayTask);
  315. %>
  316. <tr>
  317. <td>${instance}</td>
  318. <td>${cronTask.expression}</td>
  319. <td><a href="scheduler.jsp?action=execute&group=fixedDelayTasks&index=${index}">execute</a></td>
  320. </tr>
  321. <%
  322. i++;
  323. }
  324. }
  325. %>
  326. </tbody>
  327. </table>
  328. <h5>ScheduledFuture</h5>
  329. <table border="1">
  330. <thead>
  331. <tr>
  332. <th>future</th>
  333. <th>next time</th>
  334. <th>cancel</th>
  335. <th>done</th>
  336. </tr>
  337. </thead>
  338. <tbody>
  339. <%
  340. Set<ScheduledFuture<?>> scheduledFutures = (Set<ScheduledFuture<?>>) forceGetField(scheduledTaskRegistrar, "scheduledFutures");
  341. if (scheduledFutures != null) {
  342. int i = 0;
  343. long now = System.currentTimeMillis();
  344. for (ScheduledFuture scheduledFuture : scheduledFutures) {
  345. pageContext.setAttribute("index", i);
  346. pageContext.setAttribute("scheduledFuture", scheduledFuture);
  347. if (scheduledFuture instanceof DelegatingErrorHandlingRunnable
  348. || scheduledFuture instanceof FutureTask) {
  349. Runnable runnable = findRunnable(scheduledFuture);
  350. pageContext.setAttribute("instance", findInstance(runnable));
  351. } else {
  352. pageContext.setAttribute("instance", scheduledFuture);
  353. }
  354. long time = now + scheduledFuture.getDelay(TimeUnit.MILLISECONDS);
  355. Date date = new Date(time);
  356. DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  357. pageContext.setAttribute("dateText", dateFormat.format(date));
  358. %>
  359. <tr>
  360. <td>${instance}</td>
  361. <td>${dateText}</td>
  362. <td>
  363. ${scheduledFuture.cancelled}&nbsp;
  364. <%if(!scheduledFuture.isCancelled()){%>
  365. <a href="scheduler.jsp?action=cancel&group=scheduledFutures&index=${index}">cancel</a>
  366. <%}else{%>
  367. <a href="scheduler.jsp?action=active&group=scheduledFutures&index=${index}">active</a>
  368. <%}%>
  369. </td>
  370. <td>${scheduledFuture.done}</td>
  371. </tr>
  372. <%
  373. i++;
  374. }
  375. }
  376. %>
  377. </tbody>
  378. </table>
  379. </body>
  380. </html>