叢集伺服器下使用SpringBoot @Scheduled註解定時任務
阿新 • • 發佈:2019-02-03
SpringBoot提供了 Schedule模組完美支援定時任務的執行
在實際開發中由於專案部署在分散式或叢集伺服器上 會導致定時任務多次觸發
因此,使用redis分佈鎖機制可以有效避免多次執行定時任務
核心方法是org.springframework.data.redis.core包下的
setIfAbsent() 方法 返回值為布林型別
方法類似redis的SETNX命令 即”SET if Not Exists”
伺服器在執行郵件定時傳送任務之前會向redis快取中寫入lock_key即任務鎖 表明此伺服器正在執行定時任務
另一臺伺服器在寫入鎖時 由於鎖已經存在就不做任何操作
執行定時任務的伺服器在執行完成後需釋放任務鎖
RedisUtils.java@Scheduled(cron = "${scheduled.cron}") public void scheduler(){ try { if (redisUtil.get("key") == null) { if(redisUtil.setScheduler("key", "value")){ //定時任務執行程式碼 Thread.sleep(3000); } } } catch (InterruptedException e) { logger.error("定時任務異常"); }finally{ redisUtil.remove("key"); } }
public boolean setScheduler(final String key, Object value) { boolean result = false; try { ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); return operations.setIfAbsent(key, value); } catch (Exception e) { e.printStackTrace(); } return result; }