利用Linux中的crontab实现分布式项目定时任务

来源:互联网 发布:jcl外国语学院知乎 编辑:程序博客网 时间:2024/06/05 07:18
@Controller@RequestMapping("/task/topic")public class TopicQuartzController {protected Logger logger = LoggerFactory.getLogger(TopicQuartzController.class);@Autowiredprivate LiveTopicService liveTopicService;@RequestMapping("execute")@ResponseBodypublic CommonResult execute(HttpServletRequest request,HttpServletResponse response,String type){long t1 = System.currentTimeMillis();logger.error("topic定时器执行开始"+type);CommonResult result = new CommonResult();if(QlchatUtil.isEmpty(type)){result.setMsg("参数为空");result.setSuccess(false);return result;}try {switch (type) {case "autoEndTopic":this.autoEndTopic();break;case "oneWeek":this.endTopicOneWeek();break;default:break;}result.setSuccess(true);result.setMsg("执行完成" + type);} catch (Exception e) {logger.error("topic定时器执行异常" + type, e);result.setMsg("topic定时器执行异常" + type);result.setSuccess(false);}long t2 = System.currentTimeMillis();logger.error("topic定时器执行结束"+type+",耗时="+(t2 - t1) + "ms");return result;}private void autoEndTopic(){String sql = "SELECT id_ topicId FROM skg_live_topic lt WHERE lt.`status_` = 'beginning' AND lt.end_time_ IS NOT NULL AND lt.`end_time_` < NOW()";JdbcTemplate jdbcTemplate = SpringHelper.getBean(JdbcTemplate.class);List<Map<String, Object>> resultMap = jdbcTemplate.queryForList(sql);for (Map<String, Object> map : resultMap) {String topicId = String.valueOf(map.get("topicId"));try {LiveTopicPo liveTopicPo = liveTopicService.loadCache(topicId);liveTopicService.endTopic(liveTopicPo, liveTopicPo.getCreateBy());}catch (Exception e){logger.error("autoEndTopic异常" + topicId, e);}}}/** * 结束之前的没有结束时间的话题,只跑一周 */private void endTopicOneWeek(){String sql = "SELECT id_ topicId FROM skg_live_topic lt WHERE lt.`status_` = 'beginning' AND lt.end_time_ IS NULL AND lt.start_time_ <= (NOW() - interval 48 hour)";JdbcTemplate jdbcTemplate = SpringHelper.getBean(JdbcTemplate.class);List<Map<String, Object>> resultMap = jdbcTemplate.queryForList(sql);for (Map<String, Object> map : resultMap) {String topicId = String.valueOf(map.get("topicId"));try {LiveTopicPo liveTopicPo = liveTopicService.loadCache(topicId);liveTopicService.endTopic(liveTopicPo, liveTopicPo.getCreateBy());}catch (Exception e){logger.error("autoEndTopic异常" + topicId, e);}}}}

像上面这样写好定时任务的逻辑类

创建一个contab.txt

*/30 * * * * curl 'http://10.47.161.40:8181/task/topic/execute.do?type=oneWeek'
*/30 * * * * curl 'http://10.47.161.40:8181/task/topic/execute.do?type=autoEndTopic'
里面这样调用方法去执行即可实现分布式项目的定时任务

上面即每30分钟执行一次

原创粉丝点击