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

@Controller
@RequestMapping("/task/topic")
public class TopicQuartzController {
	protected Logger logger = LoggerFactory.getLogger(TopicQuartzController.class);
	@Autowired
	private LiveTopicService liveTopicService;

	@RequestMapping("execute")
	@ResponseBody
	public 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分钟执行一次

  

原文地址:https://www.cnblogs.com/a347911/p/8310307.html

时间: 2024-08-14 15:30:55

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

利用Linux中的计划任务+PHP网页程序(转)

利用Linux中的计划任务+PHP网页程序,实现对web服务器运行状况的监测[每5分钟监测一次,并邮件提醒]一.我的监测服务器环境:rhel5.5+apache2.2+php5二.功能描述:写一个PHP页面,实现如下功能:请求要监控的WEB服务器的某一个页面的内容,如果返回不到数据,或者返回的数据里没有包含我期望的代码[用于自定义错误页面时的情况],那我就认为WEB服务出问题了[宕机或者遭到内容改写攻击],然后就发送一个邮件出来,这个邮件可以和手机进行绑定[139邮箱可以做到]而我在计划任务里去

Linux中的crontab命令用法

Crontab 在linux中,crontab的用来设置定期执行指定的命令,我们可以用它来指定一些需要重复的事情,Linux系统的用户只需将想要定期要执行的命令序列加到crontab文件中,操作系统即会按用户配置的时间执行这些命令序列.向crontab文件里添加指令之前,需要检查下crontab服务是否已启动和是否开机自动启动: [查看状态] Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的 可以使用service crond status进行查看状态,下图是我在ce

利用Eclipse中的Maven构建Web项目(一)

利用Eclipse中的Maven构建Web项目 1.新建一个Maven Project,"New-->Other..." 2.选择"Maven Project" 3.选择项目路径 Usedefault Workspace location默认工作空间, 选择项目类型 在Artifact Id中选择maven-archetype-webapp 4.分别输入Group Id.Artifact Id和Package,单击"Finish" 5.Ma

利用Eclipse中的Maven构建Web项目(二)

利用Eclipse中的Maven构建Web项目 1.新建源文件夹,Java Resources鼠标右键,"New-->Source Folder" 2.新建src/main/java   src/main/resources  src/test/java  src/test/resources四个源包 3.双击每个文件夹的Output folder,选择路径 src/main/java和src/main/resources,选择路径target/classes; src/test

利用Eclipse中的Maven构建Web项目(三)

利用Eclipse中的Maven构建Web项目 1.将Maven Project转换成动态Web项目,鼠标右键项目,输入"Project Facets" 2.根据Dynamic Web Module的版本修改Java Compiler中的"Compiler compliance level"的版本 3.设置部署程序集(Web Deployment Assembly),删除含有"test" 4.将Maven的jar包发布到lib下, "A

利用Eclipse中的Maven构建Web项目报错

利用Eclipse中的Maven构建Web项目 1.在进行上述操作时,pom.xml一直报错 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.o

利用Eclipse中的Maven构建Web项目报错(二)

利用Eclipse中的Maven构建Web项目 1.错误描写叙述 [INFO] Scanning for projects... [INFO] [INFO] Using the builder org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder with a thread count of 1 [INFO] [INFO] ---------------------------------

Linux中使用crontab命令定时执行shell脚本或其他Linux命令

使用crontab你可以在指定的时间执行一个shell脚本或者一系列Linux命令.例如系统管理员安排一个备份任务使其每天都运行 如何往 cron 中添加一个作业? # crontab –e0 5 * * * /root/bin/backup.sh 这将会在每天早上5点运行 /root/bin/backup.sh Cron 各项的描述 以下是 crontab 文件的格式: {minute} {hour} {day-of-month} {month} {day-of-week} {full-pat

Linux下通过crontab命令来实现定时任务

一.crond的介绍 crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务. Linux下的任务调度分为两类,系统任务调度和用户任务调度. 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘.日志清理等.在/etc目录下有一个crontab文件,这个就是系统任务调度