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