您好,登錄后才能下訂單哦!
小編給大家分享一下如何利用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實現分布式項目定時任務功能”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。