spring定时任务界面化管理使用Quartz实现
功能描述:
(1)能够查看有多少定时任务,用的什么执行策略,便于管理
(2)能够通过界面操作停止或启动某个定时任务,便于管理(3)能够通过界面操作改变某个定时任务的执行策略,便于管理
具体代码实现:
pom文件
<!-- quartz监控 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
spring-application.xml文件中添加:
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" />
控制层:
/**
* @author
* @deprecated 定时任务监控
*/
@Controller
@RequestMapping(produces = "text/plain;charset=utf-8")
public class TaskController extends BaseController{
private static Logger log = Logger.getLogger("order_log");
@Autowired
private TaskService taskService;
/**
* 查询所有的定时任务
* @param request
* @return
*/
@RequestMapping("/task/taskList.do")
public ModelAndView taskList(HttpServletRequest request) {
log.info(this.getUser().getUsername() + ",进入定时任务监控页面");
List<Map<String, Object>> taskList = taskService.getAllJobs();
ModelAndView view = new ModelAndView();
view.setViewName("/Contents/task/taskList.jsp");
view.addObject("taskList", taskList);
return view;
}
/**
* 添加一个定时任务
* @param scheduleJob
* @return retObj
*/
@RequestMapping("/task/add.do")
@ResponseBody
public String addTask(HttpServletRequest request , ScheduleJob scheduleJob) {
RetObj retObj = new RetObj();
retObj.setFlag(false);
try {
CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression());
} catch (Exception e) {
retObj.setMsg("cron表达式有误,不能被解析!");
return JSON.toJSONString(retObj);
}
Object obj = null;
try {
if (StringUtils.isNotBlank(scheduleJob.getSpringId())) {
obj = SpringUtils.getBean(scheduleJob.getSpringId());
} else {
Class clazz = Class.forName(scheduleJob.getBeanClass());
obj = clazz.newInstance();
}
} catch (Exception e) {
// do nothing.........
}
if (obj == null) {
retObj.setMsg("未找到目标类!");
return JSON.toJSONString(retObj);
} else {
Class clazz = obj.getClass();
Method method = null;
try {
method = clazz.getMethod(scheduleJob.getMethodName(), null);
} catch (Exception e) {
// do nothing.....
}
if (method == null) {
retObj.setMsg("未找到目标方法!");
return JSON.toJSONString(retObj);
}
}
try {
taskService.addTask(scheduleJob);
} catch (Exception e) {
e.printStackTrace();
retObj.setFlag(false);
retObj.setMsg("保存失败,检查 name group 组合是否有重复!");
return JSON.toJSONString(retObj);
}
retObj.setFlag(true);
return JSON.toJSONString(retObj);
}
/**
* 开启/关闭一个定时任务
* @param request
* @param jobId
* @param cmd
* @return
*/
@RequestMapping("/task/changeJobStatus.do")
@ResponseBody
public String changeJobStatus(HttpServletRequest request, Long jobId, String cmd) {
RetObj retObj = new RetObj();
retObj.setFlag(false);
try {
taskService.changeStatus(jobId, cmd);
} catch (Exception e) {
log.error(e.getMessage(), e);
retObj.setMsg("任务状态改变失败!");
return JSON.toJSONString(retObj);
}
retObj.setFlag(true);
return JSON.toJSONString(retObj);
}
/**
* 修改定时任务的执行时间间隔
* @param request
* @param jobId
* @param cron
* @return
*/
@RequestMapping("/task/updateCron.do")
@ResponseBody
public String updateCron(HttpServletRequest request, Long jobId, String cron) {
RetObj retObj = new RetObj();
retObj.setFlag(false);
try {
CronScheduleBuilder.cronSchedule(cron);
} catch (Exception e) {
retObj.setMsg("cron表达式有误,不能被解析!");
return JSON.toJSONString(retObj);
}
try {
taskService.updateCron(jobId, cron);
} catch (SchedulerException e) {
retObj.setMsg("cron更新失败!");
return JSON.toJSONString(retObj);
}
retObj.setFlag(true);
return JSON.toJSONString(retObj);
}
}
service层
TaskServiceImpl
/**
* @author
*/
@Service("taskService")
@Transactional(rollbackFor=Exception.class)
public class TaskServiceImpl implements TaskService{
private static Logger log = Logger.getLogger("order_log");
@Autowired
private SchedulerFactoryBean schedulerFactoryBean;
@Autowired
private TaskDao taskDao;
/**
* 查询所有的定时任务
*/
@Override
public List<Map<String, Object>> getAllJobs() {
return taskDao.getAllJobs();
}
/**
* 添加一个定时任务
*/
@Override
public void addTask(ScheduleJob job) {
job.setCreateTime(new Date());
taskDao.addTask(job);
}
/**
* 更改任务状态
*
* @throws SchedulerException
*/
@Override
public void changeStatus(Long jobId, String cmd) throws SchedulerException {
ScheduleJob job = getTaskById(jobId);
if (job == null) {
return;
}
if ("stop".equals(cmd)) {
deleteJob(