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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章