xxl-job

JobInfoController.java 8.7KB

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