java监控定时任务_Quartz+Spring 实现定时任务的 管理和监控

0,监控的意义

(1)能够查看有多少定时任务,用的什么执行策略,便于管理

(2)能够通过界面操作停止或启动某个定时任务,便于管理

(3)能够通过界面操作改变某个定时任务的执行策略,便于管理

1,pom.xml 文件添加jar

1

2

3 org.quartz-scheduler

4 quartz

5 2.2.1

6

7

8 org.quartz-scheduler

9 quartz-jobs

10 2.2.1

11

2,applicationContext.xml添加

class="org.springframework.scheduling.quartz.SchedulerFactoryBean" />

或者SpringBoot中

1 @Bean2 publicSchedulerFactoryBean schedulerFactoryBean() {3

4   return newSchedulerFactoryBean();5 }

3,Taskcontroller层

1 /**

2 *@authoraisino-xxy3 *@deprecated定时任务监控4 */

5 @Controller6 @RequestMapping(produces = "text/plain;charset=utf-8")7 public class TaskController extendsBaseController{8 private static Logger log = Logger.getLogger("order_log");9

10 @Autowired11 privateTaskService taskService;12

13 /**

14 * 查询所有的定时任务15 *@paramrequest16 *@return

17 */

18 @RequestMapping("/task/taskList.do")19 publicModelAndView taskList(HttpServletRequest request) {20   log.info(this.getUser().getUsername() + ",进入定时任务监控页面");21

22   List> taskList =taskService.getAllJobs();23   ModelAndView view = newModelAndView();24   view.setViewName("/Contents/task/taskList.jsp");25   view.addObject("taskList", taskList);26   returnview;27 }28

29

30 /**

31 * 添加一个定时任务32 *@paramscheduleJob33 *@returnretObj34 */

35 @RequestMapping("/task/add.do")36 @ResponseBody37 publicString addTask(HttpServletRequest request , ScheduleJob scheduleJob) {38   RetObj retObj = newRetObj();39   retObj.setFlag(false);40   try{41 CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression());42   } catch(Exception e) {43     retObj.setMsg("cron表达式有误,不能被解析!");44     returnJSON.toJSONString(retObj);45 }46

47   Object obj = null;48   try{49     if(StringUtils.isNotBlank(scheduleJob.getSpringId())) {50       obj =SpringUtils.getBean(scheduleJob.getSpringId());51     } else{52       Class clazz =Class.forName(scheduleJob.getBeanClass());53       obj =clazz.newInstance();54 }55    } catch(Exception e) {56     //do nothing.........

57 }58   if (obj == null) {59     retObj.setMsg("未找到目标类!");60     returnJSON.toJSONString(retObj);61   } else{62     Class clazz =obj.getClass();63     Method method = null;64   try{65     method = clazz.getMethod(scheduleJob.getMethodName(), null);66   } catch(Exception e) {67     //do nothing.....

68 }69   if (method == null) {70     retObj.setMsg("未找到目标方法!");71     returnJSON.toJSONString(retObj);72 }73 }74

75

76   try{77 taskService.addTask(scheduleJob);78   } catch(Exception e) {79 e.printStackTrace();80     retObj.setFlag(false);81     retObj.setMsg("保存失败,检查 name group 组合是否有重复!");82     returnJSON.toJSONString(retObj);83 }84

85   retObj.setFlag(true);86   returnJSON.toJSONString(retObj);87 }88

89

90

91 /**

92 * 开启/关闭一个定时任务93 *@paramrequest94 *@paramjobId95 *@paramcmd96 *@return

97 */

98 @RequestMapping("/task/changeJobStatus.do")99 @ResponseBody100 publicString changeJobStatus(HttpServletRequest request, Long jobId, String cmd) {101   RetObj retObj = newRetObj();102   retObj.setFlag(false);103   try{104 taskService.changeStatus(jobId, cmd);105   } catch(Exception e) {106 log.error(e.getMessage(), e);107     retObj.setMsg("任务状态改变失败!");108     returnJSON.toJSONString(retObj);109 }110   retObj.setFlag(true);111   returnJSON.toJSONString(retObj);112 }113

114

115

116 /**

117 * 修改定时任务的执行时间间隔118 *@paramrequest119 *@paramjobId120 *@paramcron121 *@return

122 */

123 @RequestMapping("/task/updateCron.do")124 @ResponseBody125 publicString updateCron(HttpServletRequest request, Long jobId, String cron) {126   RetObj retObj = newRetObj();127   retObj.setFlag(false);128   try{129 CronScheduleBuilder.cronSchedule(cron);130   } catch(Exception e) {131     retObj.setMsg("cron表达式有误,不能被解析!");132     returnJSON.toJSONString(retObj);133 }134   try{135 taskService.updateCron(jobId, cron);136   } catch(SchedulerException e) {137     retObj.setMsg("cron更新失败!");138     returnJSON.toJSONString(retObj);139 }140   retObj.setFlag(true);141   returnJSON.toJSONString(retObj);142 }143 }

4,TaskServiceImpl

1 /**

2 *@authoraisino-xxy3 *4 */

5 @Service("taskService")6 @Transactional(rollbackFor=Exception.class)7 public class TaskServiceImpl implementsTaskService{8 private static Logger log = Logger.getLogger("order_log");9

10 @Autowired11 privateSchedulerFactoryBean schedulerFactoryBean;12

13 @Autowired14 privateTaskDao taskDao;15

16 /**

17 * 查询所有的定时任务18 */

19 @Override20 public List>getAllJobs() {21   returntaskDao.getAllJobs();22 }23

24 /**

25 * 添加一个定时任务26 */

27 @Override28 public voidaddTask(ScheduleJob job) {29   job.setCreateTime(newDate());30 taskDao.addTask(job);31 }32

33 /**

34 * 更改任务状态35 *36 *@throwsSchedulerException37 */

38 @Override39 public void changeStatus(Long jobId, String cmd) throwsSchedulerException {40   ScheduleJob job =getTaskById(jobId);41   if (job == null) {42   return;43 }44   if ("stop".equals(cmd)) {45 deleteJob(job);46 job.setJobStatus(ScheduleJob.STATUS_NOT_RUNNING);47   } else if ("start".equals(cmd)) {48 job.setJobStatus(ScheduleJob.STATUS_RUNNING);49 addJob(job);50 }51 taskDao.updateJobStatusById(jobId,job.getJobStatus());52 }53

54

55 /**

56 * 从数据库中查询job57 */

58 publicScheduleJob getTaskById(Long jobId) {59   Map job =taskDao.getJobById(jobId);60   returnScheduleJob.transMap2Bean(job);61 }62

63

64 /**

65 * 更改任务 cron表达式66 *67 *@throwsSchedulerException68 */

69 @Override70 public void updateCron(Long jobId, String cron) throwsSchedulerException {71   ScheduleJob job =getTaskById(jobId);72   if (job == null) {73     return;74 }75 job.setCronExpression(cron);76   if(ScheduleJob.STATUS_RUNNING.equals(job.getJobStatus())) {77 updateJobCron(job);78 }79 taskDao.updateJobCronById(jobId, cron);80 }81

82 /**

83 * 添加任务84 *85 *@paramscheduleJob86 *@throwsSchedulerException87 */

88 public void addJob(ScheduleJob job) throwsSchedulerException {89   if (job == null || !ScheduleJob.STATUS_RUNNING.equals(job.getJobStatus())) {90     return;91 }92

93   Scheduler scheduler =schedulerFactoryBean.getScheduler();94   log.debug(scheduler + "....................add..............");95

96   TriggerKey triggerKey =TriggerKey.triggerKey(job.getJobName(), job.getJobGroup());97   CronTrigger trigger =(CronTrigger) scheduler.getTrigger(triggerKey);98

99   //不存在,创建一个

100   if (null ==trigger) {101     Class clazz = ScheduleJob.CONCURRENT_IS.equals(job.getIsConcurrent()) ? QuartzJobFactory.class : QuartzJobFactoryDisallowConcurrentExecution.class;102     JobDetail jobDetail =JobBuilder.newJob(clazz).withIdentity(job.getJobName(), job.getJobGroup()).build();103     jobDetail.getJobDataMap().put("scheduleJob", job);104     CronScheduleBuilder scheduleBuilder =CronScheduleBuilder.cronSchedule(job.getCronExpression());105     trigger =TriggerBuilder.newTrigger().withIdentity(job.getJobName(), job.getJobGroup()).withSchedule(scheduleBuilder).build();106 scheduler.scheduleJob(jobDetail, trigger);107   } else{108     //Trigger已存在,那么更新相应的定时设置

109     CronScheduleBuilder scheduleBuilder =CronScheduleBuilder.cronSchedule(job.getCronExpression());110     //按新的cronExpression表达式重新构建trigger

111     trigger =trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();112     //按新的trigger重新设置job执行

113 scheduler.rescheduleJob(triggerKey, trigger);114 }115 }116

117

118

119 /**

120 * 删除一个job121 *122 *@paramscheduleJob123 *@throwsSchedulerException124 */

125 public void deleteJob(ScheduleJob scheduleJob) throwsSchedulerException {126   Scheduler scheduler =schedulerFactoryBean.getScheduler();127   JobKey jobKey =JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());128 scheduler.deleteJob(jobKey);129 }130

131

132 /**

133 * 立即执行job134 *135 *@paramscheduleJob136 *@throwsSchedulerException137 */

138 public void runAJobNow(ScheduleJob scheduleJob) throwsSchedulerException {139   Scheduler scheduler =schedulerFactoryBean.getScheduler();140   JobKey jobKey =JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());141 scheduler.triggerJob(jobKey);142 }143

144 /**

145 * 更新job时间表达式146 *147 *@paramscheduleJob148 *@throwsSchedulerException149 */

150 public void updateJobCron(ScheduleJob scheduleJob) throwsSchedulerException {151   Scheduler scheduler =schedulerFactoryBean.getScheduler();152   TriggerKey triggerKey =TriggerKey.triggerKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());153   CronTrigger trigger =(CronTrigger) scheduler.getTrigger(triggerKey);154   CronScheduleBuilder scheduleBuilder =CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression());155   trigger =trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();156 scheduler.rescheduleJob(triggerKey, trigger);157 }158

159 @PostConstruct160 public void init() throwsException {161   //Scheduler scheduler = schedulerFactoryBean.getScheduler();162   //这里获取任务信息数据

163   List> jobList =taskDao.getAllJobs();164

165   for (Mapmap : jobList) {166     ScheduleJob job =ScheduleJob.transMap2Bean(map);167 addJob(job);168 }169 }170 }

5,model

RetObj.java

1 /**

2 *@authoraisino-xxy3 * 返回值4 */

5 public classRetObj {6   private boolean flag = true;7   privateString msg;8   privateObject obj;9

10 set……11 get……12 }

ScheduleJob.java

1 /**

2 *@authoraisino-xxy3 * @Description: 计划任务信息4 */

5 public classScheduleJob {6 public static final String STATUS_RUNNING = "1";7 public static final String STATUS_NOT_RUNNING = "0";8 public static final String CONCURRENT_IS = "1";9 public static final String CONCURRENT_NOT = "0";10 privateLong jobId;11

12 privateDate createTime;13

14 privateDate updateTime;15 /**

16 * 任务名称17 */

18 privateString jobName;19 /**

20 * 任务分组21 */

22 privateString jobGroup;23 /**

24 * 任务状态 是否启动任务25 */

26 privateString jobStatus;27 /**

28 * cron表达式29 */

30 privateString cronExpression;31 /**

32 * 描述33 */

34 privateString description;35 /**

36 * 任务执行时调用哪个类的方法 包名+类名37 */

38 privateString beanClass;39 /**

40 * 任务是否有状态41 */

42 privateString isConcurrent;43 /**

44 * spring bean45 */

46 privateString springId;47 /**

48 * 任务调用的方法名49 */

50 privateString methodName;51

52 set……53 get……54

55

56 public static ScheduleJob transMap2Bean(Mapmap){57 ScheduleJob job = newScheduleJob();58   try{59     job.setJobId((Long) map.get("job_id"));60     job.setJobName((String) map.get("job_name"));61     job.setJobGroup((String) map.get("job_group"));62     job.setJobStatus((String) map.get("job_status"));63     job.setCronExpression((String) map.get("cron_expression"));64     job.setDescription((String) map.get("description"));65     job.setBeanClass((String) map.get("bean_class"));66     job.setIsConcurrent((String) map.get("is_concurrent"));67     job.setSpringId((String) map.get("spring_id"));68     job.setMethodName((String) map.get("method_name"));69     //job.setCreateTime(new Date((String) map.get("create_time")));

70   } catch(Exception e) {71 e.printStackTrace();72     return null;73 }74 returnjob;75 }76 }

6,utils

QuartzJobFactory.java

1 /**

2 *3 * @Description: 计划任务执行处 无状态4 */

5 public class QuartzJobFactory implementsJob {6 public final Logger log = Logger.getLogger(this.getClass());7

8 public void execute(JobExecutionContext context) throwsJobExecutionException {9   ScheduleJob scheduleJob = (ScheduleJob) context.getMergedJobDataMap().get("scheduleJob");10 TaskUtils.invokMethod(scheduleJob);11 }12 }

QuartzJobFactoryDisallowConcurrentExecution.java

1 /**

2 *3 * @Description: 若一个方法一次执行不完下次轮转时则等待改方法执行完后才执行下一次操作4 */

5 @DisallowConcurrentExecution6 public class QuartzJobFactoryDisallowConcurrentExecution implementsJob {7 public final Logger log = Logger.getLogger(this.getClass());8

9 public void execute(JobExecutionContext context) throwsJobExecutionException {10   ScheduleJob scheduleJob = (ScheduleJob) context.getMergedJobDataMap().get("scheduleJob");11 TaskUtils.invokMethod(scheduleJob);12 }13 }

TaskUtils.java

1 public classTaskUtils {2 public final static Logger log = Logger.getLogger(TaskUtils.class);3

4 /**

5 * 通过反射调用scheduleJob中定义的方法6 *7 *@paramscheduleJob8 */

9 public static voidinvokMethod(ScheduleJob scheduleJob) {10   Object object = null;11   Class clazz = null;12   if(StringUtils.isNotBlank(scheduleJob.getSpringId())) {13     object =SpringUtils.getBean(scheduleJob.getSpringId());14   } else if(StringUtils.isNotBlank(scheduleJob.getBeanClass())) {15   try{16     clazz =Class.forName(scheduleJob.getBeanClass());17     object =clazz.newInstance();18   } catch(Exception e) {19     //TODO Auto-generated catch block

20 e.printStackTrace();21 }22 }23   if (object == null) {24     log.error("任务名称 = [" + scheduleJob.getJobName() + "]---------------未启动成功,请检查是否配置正确!!!");25     return;26 }27   clazz =object.getClass();28   Method method = null;29   try{30     method =clazz.getDeclaredMethod(scheduleJob.getMethodName());31   } catch(NoSuchMethodException e) {32     log.error("任务名称 = [" + scheduleJob.getJobName() + "]---------------未启动成功,方法名设置错误!!!");33   } catch(SecurityException e) {34     //TODO Auto-generated catch block

35 e.printStackTrace();36 }37   if (method != null) {38   try{39 method.invoke(object);40   } catch(IllegalAccessException e) {41     //TODO Auto-generated catch block

42 e.printStackTrace();43   } catch(IllegalArgumentException e) {44     //TODO Auto-generated catch block

45 e.printStackTrace();46   } catch(InvocationTargetException e) {47     //TODO Auto-generated catch block

48 e.printStackTrace();49 }50 }51  System.out.println("任务名称 = [" + scheduleJob.getJobName() + "]----------启动成功");52 }53 }

SpringUtils.java

1 public final class SpringUtils implementsBeanFactoryPostProcessor {2

3 private static ConfigurableListableBeanFactory beanFactory; //Spring应用上下文环境

4 public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throwsBeansException {5 SpringUtils.beanFactory =beanFactory;6 }7

8 /**

9 * 获取对象10 *11 *@paramname12 *@returnObject 一个以所给名字注册的bean的实例13 *@throwsorg.springframework.beans.BeansException14 *15 */

16 @SuppressWarnings("unchecked")17 public static T getBean(String name) throwsBeansException {18   return(T) beanFactory.getBean(name);19 }20

21 /**

22 * 获取类型为requiredType的对象23 *24 *@paramclz25 *@return

26 *@throwsorg.springframework.beans.BeansException27 *28 */

29 public static T getBean(Class clz) throwsBeansException {30   @SuppressWarnings("unchecked")31   T result =(T) beanFactory.getBean(clz);32   returnresult;33 }34

35 /**

36 * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true37 *38 *@paramname39 *@returnboolean40 */

41 public static booleancontainsBean(String name) {42   returnbeanFactory.containsBean(name);43 }44

45 /**

46 * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。47 * 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)48 *49 *@paramname50 *@returnboolean51 *@throwsorg.springframework.beans.factory.NoSuchBeanDefinitionException52 *53 */

54 public static boolean isSingleton(String name) throwsNoSuchBeanDefinitionException {55   returnbeanFactory.isSingleton(name);56 }57

58 /**

59 *@paramname60 *@returnClass 注册对象的类型61 *@throwsorg.springframework.beans.factory.NoSuchBeanDefinitionException62 *63 */

64 public static Class> getType(String name) throwsNoSuchBeanDefinitionException {65   returnbeanFactory.getType(name);66 }67

68 /**

69 * 如果给定的bean名字在bean定义中有别名,则返回这些别名70 *71 *@paramname72 *@return

73 *@throwsorg.springframework.beans.factory.NoSuchBeanDefinitionException74 *75 */

76 public static String[] getAliases(String name) throwsNoSuchBeanDefinitionException {77   returnbeanFactory.getAliases(name);78 }79 }

7,taskList.jsp

1

2

3

4

5

6

7

8 String path =request.getContextPath();9 String rootPath = request.getScheme() + "://"

10 + request.getServerName() + ":" +request.getServerPort()11 + "/";12 String basePath = request.getScheme() + "://"

13 + request.getServerName() + ":" +request.getServerPort()14 + path + "/";15 request.setAttribute("basePath", basePath);16 request.setAttribute("rootPath", rootPath);17 pageContext.setAttribute("newLineChar", "\n");18 %>

19

20

21

22

23

24

25

26 .list_table {27 border: 1px solid #CCCCCC;28 border-collapse: collapse;29 color: #333333;30 margin: 0 0 0;31 width: 100%;32 text-align: center;33 }34

35 .list_table tbody td {36 border-top: 1px solid #CCCCCC;37 margin: 0 0 0;38 text-align: center;39 }40

41 .list_table th {42 line-height: 1.2em;43 vertical-align: top;44 }45

46 .list_table td {47 line-height: 2em;48 font-size: 12px;49 vertical-align: central;50 align: center;51 }52

53 .list_table td input {54 width: 90%;55 }56

57 .list_table tbody tr:hover th,.list_table tbody tr:hover td {58 background: #EEF0F2;59 }60

61 .list_table thead tr {62 background: none repeat scroll 0 0#09f;63 color: #fff;64 font-weight: bold;65 border-bottom: 1px solid #CCCCCC;66 border-right: 1px solid #CCCCCC;67 }68

69 .datagrid-mask {70 background: #ccc;71 }72

73 .datagrid-mask-msg {74 border-color: #95B8E7;75 }76

77 .datagrid-mask-msg {78 background: #ffffff79 center;80 }81

82 .datagrid-mask {83 position: absolute;84 left: 0;85 top: 0;86 width: 100%;87 height: 100%;88 opacity: 0.3;89 filter: alpha(opacity = 30);90 display: none;91 }92

93 .datagrid-mask-msg {94 position: absolute;95 top: 50%;96 margin-top: -20px;97 padding: 12px 5px 10px 30px;98 width: auto;99 height: 16px;100 border-width: 2px;101 border-style: solid;102 display: none;103 }104

105

106

107

108

定时任务监控

109

110

111

112

113

114

115

id

116

name

117

group

118

状 态

119

cron表达式

120

描 述

121

同步否

122

类路径

123

spring id

124

方法名

125

操作

126

127

128

129

130

131

${job.job_id }

132

${job.job_name }

133

${job.job_group }

134

${job.job_status }135

136

137

138 οnclick="changeJobStatus('${job.job_id}','stop')">停止

 139

140

141

142 οnclick="changeJobStatus('${job.job_id}','start')">开启

 143

144

145

146

${job.cron_expression }

147

${job.description }

148

${job.is_concurrent }

149

${job.bean_class }

150

${job.spring_id }

151

${job.method_name }

152

更新cron

153

154

155

156

n

157

158

159

0

160

161 id="cronExpression">

162

163

164 1

165 0

166

167

168

169

170

171

172

173

174

175

176 function validateAdd() {177 if ($.trim($('#jobName').val()) == '') {178 alert('name不能为空!');179 $('#jobName').focus();180 return false;181 }182 if ($.trim($('#jobGroup').val()) == '') {183 alert('group不能为空!');184 $('#jobGroup').focus();185 return false;186 }187 if ($.trim($('#cronExpression').val()) == '') {188 alert('cron表达式不能为空!');189 $('#cronExpression').focus();190 return false;191 }192 if ($.trim($('#beanClass').val()) == '' && $.trim($('#springId').val()) == '') {193 $('#beanClass').focus();194 alert('类路径和spring id至少填写一个');195 return false;196 }197 if ($.trim($('#methodName').val()) == '') {198 $('#methodName').focus();199 alert('方法名不能为空!');200 return false;201 }202 return true;203 }204

205 function add() {206 if(validateAdd()) {207 showWaitMsg();208 $.ajax({209 type : "POST",210 async : false,211 dataType : "JSON",212 cache : false,213 url : "${basePath}task/add.do",214 data : $("#addForm").serialize(),215 success : function(data) {216 hideWaitMsg();217 if(data.flag) {218 location.reload();219 } else{220 alert(data.msg);221 }222 }//end-callback

223 });//end-ajax

224 }225 }226

227 function changeJobStatus(jobId, cmd) {228 showWaitMsg();229 $.ajax({230 type : "POST",231 async : false,232 dataType : "JSON",233 cache : false,234 url : "${basePath}task/changeJobStatus.do",235 data : {236 jobId : jobId,237 cmd : cmd238 },239 success : function(data) {240 hideWaitMsg();241 if(data.flag) {242 location.reload();243 } else{244 alert(data.msg);245 }246 }//end-callback

247 });//end-ajax

248 }249

250 function updateCron(jobId) {251 var cron = prompt("输入cron表达式!", "")252 if(cron) {253 showWaitMsg();254 $.ajax({255 type : "POST",256 async : false,257 dataType : "JSON",258 cache : false,259 url : "${basePath}task/updateCron.do",260 data : {261 jobId : jobId,262 cron : cron263 },264 success : function(data) {265 hideWaitMsg();266 if(data.flag) {267 location.reload();268 } else{269 alert(data.msg);270 }271 }//end-callback

272 });//end-ajax

273 }274 }275

276 function showWaitMsg(msg) {277 if(msg) {278

279 } else{280 msg = '正在处理,请稍候...';281 }282 var panelContainer = $("body");283 $("

289 function hideWaitMsg() {290   $('.datagrid-mask').remove();291   $('.datagrid-mask-msg').remove();292 }293

294

295

8,SQL脚本

1 CREATE TABLE `task_schedule` (2 `job_id` bigint(11) NOT NULL AUTO_INCREMENT,3 `job_name` varchar(150) DEFAULT NULL,4 `job_group` varchar(150) DEFAULT NULL,5 `cron_expression` varchar(150) DEFAULT NULL,6 `bean_class` varchar(300) DEFAULT NULL,7 `spring_id` varchar(150) DEFAULT NULL,8 `method_name` varchar(150) DEFAULT NULL,9 `job_status` varchar(6) DEFAULT NULL COMMENT '0没启动,1启动',10 `is_concurrent` varchar(6) DEFAULT NULL COMMENT '是否等待上个任务完成,0是等待 1是不等待;',11 `description` varchar(600) DEFAULT NULL,12 `create_time` timestamp NULL DEFAULT NULL,13 `update_time` timestamp NULL DEFAULT NULL,14 PRIMARY KEY (`job_id`)15 ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='新的定时任务系统表';

insert into `task_schedule` (`job_id`, `job_name`, `job_group`, `cron_expression`, `bean_class`, `spring_id`, `method_name`, `job_status`, `is_concurrent`, `description`, `create_time`, `update_time`) values('1','SyncNotifyToSas','SyncController','0 0/2 * * * ?','com.ao.task.job.ordersync.SyncController',NULL,'SyncNotifyToSas','0','1','异步通知给Sas','2017-12-19 16:19:34','2017-12-28 13:55:57');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值