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

认识crond服务

1、crond是Linux用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。crond命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。而Linux任务调度的工作主要分为以下两类:

  ①系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存

  ②个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置

 2、Crontab是UNIX系统下的定时任务触发器,其使用者的权限记载在下列两个文件中:

  ①/etc/cron.deny 该文件中所列的用户不允许使用Crontab命令

  ②/etc/cron.allow 该文件中所列的用户允许使用Crontab命令

 3、/var/spool/cron/ 是所有用户的crontab文件

4、启动、停止、查看crond服务:

①启动:service crond start

②停止:service crond stop

③查看:service crond status

@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分钟执行一次

总结

以上所述是小编给大家介绍的利用Linux中的crontab实现分布式项目定时任务功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Linux定时任务Crontab详解(推荐)

    今天做了个数据库的备份脚本,顺便系统得学习一下Linux下定时执行脚本的设置.Linux下的定时执行主要是使用crontab文件中加入定制计划来执行,设置比Windows稍微复杂一些(因为没有图形界面嘛),但是也不是非常复杂,基本上用过一遍就能记住了,关键是要记住/var/spool/cron这个目录.下面看一下具体的用法: 首先查看一下/etc/crontab文件: $ cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/us

  • Linux中crontab定时任务不执行的原因

    最近在linux中遇到了个crontab定时任务不执行的case,在这给大家分享一下,避免踩到我遇到的坑. 先贴脚本吧 为了方便展示,把脚本入参,都写死了 #!/usr/bin/env bash # 1输出文件,到log 例如: bg # 2 目标文件目录 不带最后的/ 例如:/opt/flume/home/hdp_lbg_ectech/rawdata/xxx/web_vip_bg # 3 执行的时候选择前几天的日志 例如:1 LAST_DAY=$(date +"%Y-%m-%d" -

  • Linux crontab定时任务配置方法(详解)

    CRONTAB概念/介绍 crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供之后读取和执行. cron 系统调度进程. 可以使用它在每天的非高峰负荷时间段运行作业,或在一周或一月中的不同时段运行.cron是系统主要的调度进程,可以在无需人工干预的情况下运行作业.crontab命令允许用户提交.编辑或删除相应的作业.每一个用户都可以有一个crontab文件来保存调度信息.系统管理员可以通过cron.deny 和 cron

  • Linux定时任务的设置及 crontab 配置指南

    为当前用户创建cron服务 1.  键入 crontab  -e 编辑crontab服务文件 例如 文件内容如下: */2 * * * * /bin/sh /home/admin/jiaoben/buy/deleteFile.sh 保存文件并并退出 */2 * * * * /bin/sh /home/admin/jiaoben/buy/deleteFile.sh */2 * * * * 通过这段字段可以设定什么时候执行脚本 /bin/sh /home/admin/jiaoben/buy/dele

  • 详解linux下利用crontab创建定时任务

    Linux下可以利用crontab创建定时任务. 常用搭配 crontab -e 编辑任务 crontab -l 查看所有任务[该用户] crontab -r 取消所有任务[该用户] 任务格式 × × × × × +命令(具体任务) 前5个参数表示时间,依次为: 参数 范围 分钟 0-59 小时 0-23 日期 1-31 月份 1-12 星期 0-6(0代表星期日) 特殊符号 为了精确表示定时,需要一些特殊符号来描述具体的任务执行时间.有以下几个符号: "/" 代表每,每隔多长时间 &

  • Linux中使用crontab命令启用自定义定时任务实例

    Linux下的定时执行主要是使用crontab文件中加入定制计划来执行,设置比Windows稍微复杂一些(因为没有图形界面嘛),但是也不是非常复杂,有需要的朋友可以了解一下. 一 简介 Linux下的任务调度分为两类,系统任务调度和用户任务调度 系统任务调度:系统需要定期执行的任务,比如重启.日志清理等,其配置文件是:/etc/crontab 用户任务调度:某个用户需要定期执行的任务.用户可以使用 crontab 命令来配置自己的定时任务.所有用户配置的定时任务都存放在 /var/spool/c

  • linux使用crontab实现PHP执行计划定时任务

    首先说说cron,它是一个linux下的定时执行工具.根用户以外的用户可以使用 crontab 工具来配置 cron 任务.所有用户定义的 crontab 都被保存在/var/spool/cron 目录中,并使用创建它们的用户身份来执行.要以某用户身份创建一个 crontab 项目,登录为该用户,然后键入 crontab -e 命令来编辑该用户的 crontab.该文件使用的格式和 /etc/crontab 相同.当对 crontab 所做的改变被保存后,该 crontab 文件就会根据该用户名

  • linux定时任务crontab 实现每秒执行一次的方法

    linux crontab 命令,最小的执行时间是一分钟.如需要在小于一分钟内重复执行,可以有两个方法实现. Cron 各项的描述 以下是 crontab 文件的格式: {minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script} o minute: 区间为 0 – 59 o hour: 区间为0 – 23 o day-of-month: 区间为0 – 31 o month: 区间为1 – 12.

  • linux如何利用crontab添加定时任务详解

    前言 linux 系统是由 crond这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的. crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供之后读取和执行. 我们可以看下crond这个系统服务的状态: 从这里可以看出来crond服务是自启动(enabled),且正在运行的(active) 另外, 由于使用者自己也可以设置计划任务,所以, Linux 系统也提供了使用者控

  • 详细介绍Linux的定时任务crontab

    一.前言 crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于"crontab"文件中(/var/spool/cron/以用户命名的文件),以供之后读取和执行.该词来源于希腊语 chronos(χρνο),原意是时间. 通常,crontab储存的指令被守护进程 - crond激活在后台运行,每一分钟检查是否有预定的作业需要执行.这类作业一般称为cron jobs. 二.启动crond进程 service cr

随机推荐