1. 程式人生 > >叢集伺服器下使用SpringBoot @Scheduled註解定時任務

叢集伺服器下使用SpringBoot @Scheduled註解定時任務

SpringBoot提供了 Schedule模組完美支援定時任務的執行

在實際開發中由於專案部署在分散式或叢集伺服器上 會導致定時任務多次觸發

因此,使用redis分佈鎖機制可以有效避免多次執行定時任務

  核心方法是org.springframework.data.redis.core包下的

 setIfAbsent() 方法 返回值為布林型別

  方法類似redis的SETNX命令 即”SET if Not Exists”

  伺服器在執行郵件定時傳送任務之前會向redis快取中寫入lock_key即任務鎖 表明此伺服器正在執行定時任務

  另一臺伺服器在寫入鎖時 由於鎖已經存在就不做任何操作

  執行定時任務的伺服器在執行完成後需釋放任務鎖

@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");
		}
	}

RedisUtils.java
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;
    }