JobInfoController.java 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. package com.xxl.job.controller;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. import javax.annotation.Resource;
  7. import org.apache.commons.lang.StringUtils;
  8. import org.quartz.CronExpression;
  9. import org.quartz.Job;
  10. import org.quartz.SchedulerException;
  11. import org.springframework.stereotype.Controller;
  12. import org.springframework.ui.Model;
  13. import org.springframework.web.bind.annotation.RequestMapping;
  14. import org.springframework.web.bind.annotation.RequestParam;
  15. import org.springframework.web.bind.annotation.ResponseBody;
  16. import com.xxl.job.client.handler.HandlerRepository;
  17. import com.xxl.job.client.util.JacksonUtil;
  18. import com.xxl.job.core.constant.Constants.JobGroupEnum;
  19. import com.xxl.job.core.model.ReturnT;
  20. import com.xxl.job.core.model.XxlJobInfo;
  21. import com.xxl.job.core.util.DynamicSchedulerUtil;
  22. import com.xxl.job.dao.IXxlJobInfoDao;
  23. import com.xxl.job.service.job.RemoteHttpJobBean;
  24. import com.xxl.job.service.job.impl.DemoConcurrentJobBean;
  25. import com.xxl.job.service.job.impl.DemoNomalJobBean;
  26. /**
  27. * index controller
  28. * @author xuxueli 2015-12-19 16:13:16
  29. */
  30. @SuppressWarnings("unchecked")
  31. @Controller
  32. @RequestMapping("/jobinfo")
  33. public class JobInfoController {
  34. @Resource
  35. private IXxlJobInfoDao xxlJobInfoDao;
  36. // remote job bean
  37. public static Class <? extends Job> remoteJobBean = RemoteHttpJobBean.class;
  38. // loacal job bean
  39. public static List<Class <? extends Job>> localJobBeanList = new ArrayList<Class<? extends Job>>();
  40. static{
  41. localJobBeanList.add((Class<? extends Job>) DemoNomalJobBean.class);
  42. localJobBeanList.add((Class<? extends Job>) DemoConcurrentJobBean.class);
  43. }
  44. @RequestMapping
  45. public String index(Model model) {
  46. model.addAttribute("localJobBeanList", localJobBeanList); // 本地任务-列表
  47. model.addAttribute("remoteJobBean", remoteJobBean); // 远程任务-jobBean
  48. model.addAttribute("JobGroupList", JobGroupEnum.values()); // 任务组列表
  49. return "jobinfo/index";
  50. }
  51. @RequestMapping("/pageList")
  52. @ResponseBody
  53. public Map<String, Object> pageList(@RequestParam(required = false, defaultValue = "0") int start,
  54. @RequestParam(required = false, defaultValue = "10") int length,
  55. String jobGroup, String jobName, String filterTime) {
  56. // page list
  57. List<XxlJobInfo> list = xxlJobInfoDao.pageList(start, length, jobGroup, jobName);
  58. int list_count = xxlJobInfoDao.pageListCount(start, length, jobGroup, jobName);
  59. // fill job info
  60. if (list!=null && list.size()>0) {
  61. for (XxlJobInfo jobInfo : list) {
  62. DynamicSchedulerUtil.fillJobInfo(jobInfo);
  63. }
  64. }
  65. // package result
  66. Map<String, Object> maps = new HashMap<String, Object>();
  67. maps.put("recordsTotal", list_count); // 总记录数
  68. maps.put("recordsFiltered", list_count); // 过滤后的总记录数
  69. maps.put("data", list); // 分页列表
  70. return maps;
  71. }
  72. @RequestMapping("/add")
  73. @ResponseBody
  74. public ReturnT<String> add(String jobGroup, String jobName, String jobCron, String jobDesc, String jobClass,
  75. String handler_params, String handler_address, String handler_name,
  76. String author, String alarmEmail, int alarmThreshold) {
  77. // valid
  78. if (JobGroupEnum.match(jobGroup) == null) {
  79. return new ReturnT<String>(500, "请选择“任务组”");
  80. }
  81. if (StringUtils.isBlank(jobName)) {
  82. return new ReturnT<String>(500, "请输入“任务名”");
  83. }
  84. if (!CronExpression.isValidExpression(jobCron)) {
  85. return new ReturnT<String>(500, "“corn”不合法");
  86. }
  87. if (StringUtils.isBlank(jobDesc)) {
  88. return new ReturnT<String>(500, "请输入“任务描述”");
  89. }
  90. Class<? extends Job> jobClass_ = null;
  91. try {
  92. Class<?> clazz = Class.forName(jobClass);
  93. if (clazz!=null) {
  94. jobClass_ = (Class<? extends Job>) clazz;
  95. }
  96. } catch (ClassNotFoundException e1) {
  97. e1.printStackTrace();
  98. }
  99. if (jobClass_ == null) {
  100. return new ReturnT<String>(500, "请选择“JobBean”");
  101. }
  102. if (jobClass_.getClass().getName().equals(remoteJobBean.getName())) {
  103. if (StringUtils.isBlank(handler_address)) {
  104. return new ReturnT<String>(500, "请输入“远程-机器地址”");
  105. }
  106. if (StringUtils.isBlank(handler_name)) {
  107. return new ReturnT<String>(500, "请输入“远程-执行器”");
  108. }
  109. }
  110. if (StringUtils.isBlank(author)) {
  111. return new ReturnT<String>(500, "请输入“负责人”");
  112. }
  113. if (StringUtils.isBlank(alarmEmail)) {
  114. return new ReturnT<String>(500, "请输入“报警邮件”");
  115. }
  116. try {
  117. if (DynamicSchedulerUtil.checkExists(jobName, jobGroup)) {
  118. return new ReturnT<String>(500, "此任务已存在,请更换任务组或任务名");
  119. }
  120. } catch (SchedulerException e1) {
  121. e1.printStackTrace();
  122. return new ReturnT<String>(500, "此任务已存在,请更换任务组或任务名");
  123. }
  124. // parse jobDataMap
  125. HashMap<String, String> jobDataMap = new HashMap<String, String>();
  126. jobDataMap.put(HandlerRepository.HANDLER_PARAMS, handler_params);
  127. jobDataMap.put(HandlerRepository.HANDLER_ADDRESS, handler_address);
  128. jobDataMap.put(HandlerRepository.HANDLER_NAME, handler_name);
  129. // Backup to the database
  130. XxlJobInfo jobInfo = new XxlJobInfo();
  131. jobInfo.setJobGroup(jobGroup);
  132. jobInfo.setJobName(jobName);
  133. jobInfo.setJobCron(jobCron);
  134. jobInfo.setJobDesc(jobDesc);
  135. jobInfo.setJobClass(jobClass);
  136. jobInfo.setJobData(JacksonUtil.writeValueAsString(jobDataMap));
  137. jobInfo.setAuthor(author);
  138. jobInfo.setAlarmEmail(alarmEmail);
  139. jobInfo.setAlarmThreshold(alarmThreshold);
  140. xxlJobInfoDao.save(jobInfo);
  141. try {
  142. // add job 2 quartz
  143. boolean result = DynamicSchedulerUtil.addJob(jobInfo);
  144. if (result) {
  145. return ReturnT.SUCCESS;
  146. } else {
  147. xxlJobInfoDao.delete(jobGroup, jobName);
  148. return new ReturnT<String>(500, "新增任务失败");
  149. }
  150. } catch (SchedulerException e) {
  151. e.printStackTrace();
  152. }
  153. return ReturnT.FAIL;
  154. }
  155. @RequestMapping("/reschedule")
  156. @ResponseBody
  157. public ReturnT<String> reschedule(String jobGroup, String jobName, String jobCron, String jobDesc, String jobClass,
  158. String handler_params, String handler_address, String handler_name,
  159. String author, String alarmEmail, int alarmThreshold) {
  160. // valid
  161. if (JobGroupEnum.match(jobGroup) == null) {
  162. return new ReturnT<String>(500, "请选择“任务组”");
  163. }
  164. if (StringUtils.isBlank(jobName)) {
  165. return new ReturnT<String>(500, "请输入“任务名”");
  166. }
  167. if (!CronExpression.isValidExpression(jobCron)) {
  168. return new ReturnT<String>(500, "“corn”不合法");
  169. }
  170. // parse jobDataMap
  171. HashMap<String, String> jobDataMap = new HashMap<String, String>();
  172. jobDataMap.put(HandlerRepository.HANDLER_PARAMS, handler_params);
  173. jobDataMap.put(HandlerRepository.HANDLER_ADDRESS, handler_address);
  174. jobDataMap.put(HandlerRepository.HANDLER_NAME, handler_name);
  175. XxlJobInfo jobInfo = xxlJobInfoDao.load(jobGroup, jobName);
  176. jobInfo.setJobCron(jobCron);
  177. jobInfo.setJobDesc(jobDesc);
  178. jobInfo.setJobData(JacksonUtil.writeValueAsString(jobDataMap));
  179. jobInfo.setAuthor(author);
  180. jobInfo.setAlarmEmail(alarmEmail);
  181. jobInfo.setAlarmThreshold(alarmThreshold);
  182. try {
  183. // fresh quartz
  184. DynamicSchedulerUtil.rescheduleJob(jobInfo);
  185. // fresh db
  186. xxlJobInfoDao.update(jobInfo);
  187. return ReturnT.SUCCESS;
  188. } catch (SchedulerException e) {
  189. e.printStackTrace();
  190. }
  191. return ReturnT.FAIL;
  192. }
  193. @RequestMapping("/remove")
  194. @ResponseBody
  195. public ReturnT<String> remove(String jobGroup, String jobName) {
  196. try {
  197. DynamicSchedulerUtil.removeJob(jobName, jobGroup);
  198. xxlJobInfoDao.delete(jobGroup, jobName);
  199. return ReturnT.SUCCESS;
  200. } catch (SchedulerException e) {
  201. e.printStackTrace();
  202. }
  203. return ReturnT.FAIL;
  204. }
  205. @RequestMapping("/pause")
  206. @ResponseBody
  207. public ReturnT<String> pause(String jobGroup, String jobName) {
  208. try {
  209. DynamicSchedulerUtil.pauseJob(jobName, jobGroup); // jobStatus do not store
  210. return ReturnT.SUCCESS;
  211. } catch (SchedulerException e) {
  212. e.printStackTrace();
  213. return ReturnT.FAIL;
  214. }
  215. }
  216. @RequestMapping("/resume")
  217. @ResponseBody
  218. public ReturnT<String> resume(String jobGroup, String jobName) {
  219. try {
  220. DynamicSchedulerUtil.resumeJob(jobName, jobGroup);
  221. return ReturnT.SUCCESS;
  222. } catch (SchedulerException e) {
  223. e.printStackTrace();
  224. return ReturnT.FAIL;
  225. }
  226. }
  227. @RequestMapping("/trigger")
  228. @ResponseBody
  229. public ReturnT<String> triggerJob(String jobGroup, String jobName) {
  230. try {
  231. DynamicSchedulerUtil.triggerJob(jobName, jobGroup);
  232. return ReturnT.SUCCESS;
  233. } catch (SchedulerException e) {
  234. e.printStackTrace();
  235. return ReturnT.FAIL;
  236. }
  237. }
  238. }