溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何利用Linux中的crontab實現(xiàn)分布式項目定時任務(wù)功能

發(fā)布時間:2021-05-28 11:57:45 來源:億速云 閱讀:254 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下如何利用Linux中的crontab實現(xiàn)分布式項目定時任務(wù)功能,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

認(rèn)識crond服務(wù)

    1、crond是Linux用來定期執(zhí)行程序的命令。當(dāng)安裝完成操作系統(tǒng)之后,默認(rèn)便會啟動此任務(wù)調(diào)度命令。crond命令每分鍾會定期檢查是否有要執(zhí)行的工作,如果有要執(zhí)行的工作便會自動執(zhí)行該工作。而Linux任務(wù)調(diào)度的工作主要分為以下兩類:

 ?、傧到y(tǒng)執(zhí)行的工作:系統(tǒng)周期性所要執(zhí)行的工作,如備份系統(tǒng)數(shù)據(jù)、清理緩存

 ?、趥€人執(zhí)行的工作:某個用戶定期要做的工作,例如每隔10分鐘檢查郵件服務(wù)器是否有新信,這些工作可由每個用戶自行設(shè)置

 2、Crontab是UNIX系統(tǒng)下的定時任務(wù)觸發(fā)器,其使用者的權(quán)限記載在下列兩個文件中:

 ?、?etc/cron.deny 該文件中所列的用戶不允許使用Crontab命令

 ?、?etc/cron.allow 該文件中所列的用戶允許使用Crontab命令

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

   4、啟動、停止、查看crond服務(wù):

    ①啟動: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定時器執(zhí)行開始"+type);
    CommonResult result = new CommonResult();
    if(QlchatUtil.isEmpty(type)){
      result.setMsg("參數(shù)為空");
      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("執(zhí)行完成" + type);
    } catch (Exception e) {
      logger.error("topic定時器執(zhí)行異常" + type, e);
      result.setMsg("topic定時器執(zhí)行異常" + type);
      result.setSuccess(false);
    }
    long t2 = System.currentTimeMillis();
    logger.error("topic定時器執(zhí)行結(jié)束"+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);
      }
    }
  }
  /**
   * 結(jié)束之前的沒有結(jié)束時間的話題,只跑一周
   */
  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);
      }
    }
  }
}

像上面這樣寫好定時任務(wù)的邏輯類 

創(chuàng)建一個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'

里面這樣調(diào)用方法去執(zhí)行即可實現(xiàn)分布式項目的定時任務(wù) 

上面即每30分鐘執(zhí)行一次

以上是“如何利用Linux中的crontab實現(xiàn)分布式項目定時任務(wù)功能”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI