摘要:當觸發定時任務時,一臺服務的任務進入切面,通過方法為唯一的加鎖,如果當前不存在,將放入緩存,并返回通過設置鎖超時時間,結束后跳出執行定時任務方法。
問題描述
將帶有定時任務的項目部署在單臺測試環境上,完全沒問題。生產上是兩臺集群服務器,項目部署上去發現定時任務的模塊同時在兩臺機器上各執行了一遍,這將會導致其他意外的發生。
解決方案----redis分布式鎖使用redis分布式鎖,為定時任務唯一指定的key加鎖,并設置鎖超時時間。當觸發定時任務時,一臺服務的任務進入切面,通過setNX(key,value)方法為唯一的key加鎖,如果當前key不存在,將放入緩存,并返回true,通過expire(key,second)設置鎖超時時間,結束后跳出執行定時任務方法。第二臺服務任務進入時,設置鎖的時候發現該鎖已存在于緩存,并返回false,不跳轉到執行定時任務方法。
核心代碼1.分布式鎖切面
@Aspect @Slf4j @Component public class CacheLockAspect { private static final String LOCK_VALUE = "locked"; @Autowired private RedisConnection connection; @Around("execution(* *.*(..)) && @annotation(com.common.annotation.CacheLock)") public void cacheLockPoint(ProceedingJoinPoint pjp) { Method cacheMethod = null; for (Method method : pjp.getTarget().getClass().getMethods()) { if (null!=method.getAnnotation(CacheLock.class)){ cacheMethod = method; break; } } try { String lockKey = cacheMethod.getAnnotation(CacheLock.class).lockedPrefix(); long timeOut = cacheMethod.getAnnotation(CacheLock.class).expireTime(); if(null == lockKey){ throw new ManagerException(ErrorMsgEnum.LOCK_NAME_EMPTY); } if (connection.setNX(lockKey.getBytes(),LOCK_VALUE.getBytes())) { connection.expire(lockKey.getBytes(),timeOut); log.info("method:{}獲取鎖:{},開始運行!",cacheMethod,lockKey); pjp.proceed(); return; } log.info("method:{}未獲取鎖:{},運行失敗!",cacheMethod,lockKey); } catch (Throwable e) { log.error("method:{},運行錯誤!",cacheMethod,e); throw new ManagerException(ErrorMsgEnum.LOCK_JOB_ERROR,e); } } }
2.手寫方法級注解
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface CacheLock { String lockedPrefix() default ""; //redis 鎖key的前綴 long expireTime() default 10; //key在redis里存在的時間,1000S }
3.定時任務服務
@Slf4j @Service public class TimeTaskService { /** * 執行定時任務 **/ @Scheduled(cron = "0 0 1 * * ?") @CacheLock(lockedPrefix = "TimeTaskService",expireTime=30) public void executeTask() { System.out.println("hello world!"); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72599.html
摘要:考拉訂單流推送申報單推送物流信息等供應鏈相關業務已接入分片任務,極大提高了業務吞吐量降低壓力,提升了通關效率。支撐雙十一黑五雙十二等大促,高峰期統一暫停非關鍵定時任務,讓出系統資源,提高業務系統穩定性。 此文已由作者楊凱明授權網易云社區發布。 歡迎訪問網易云社區,了解更多網易技術產品運營經驗。 1.背景 目前項目中使用的定時任務框架存在下面這些問題 沒有統一的定時任務管理平臺 目前項目...
摘要:分布式鎖實現方式前言目前幾乎很多大型網站及應用都是分布式部署的,分布式場景中的數據一致性問題一直是一個比較重要的話題。基于數據庫實現分布式鎖基于緩存等實現分布式鎖基于實現分布式鎖。 前言 分布式鎖,是控制分布式系統之間同步訪問共享資源的一種方式 在分布式系統中,常常需要協調他們的動作。如果不同的系統或是同一個系統的不同主機之間共享了一個或一組資源,那么訪問這些資源的時候,往往需要互斥...
摘要:分布式鎖實現方式前言目前幾乎很多大型網站及應用都是分布式部署的,分布式場景中的數據一致性問題一直是一個比較重要的話題。基于數據庫實現分布式鎖基于緩存等實現分布式鎖基于實現分布式鎖。 前言 分布式鎖,是控制分布式系統之間同步訪問共享資源的一種方式 在分布式系統中,常常需要協調他們的動作。如果不同的系統或是同一個系統的不同主機之間共享了一個或一組資源,那么訪問這些資源的時候,往往需要互斥...
摘要:綜合上述缺點,小明痛定思痛,提出了經營方式二。當客戶下單,小明按送達地點標注好,依次放在一個地方。因此,有強一致性要求的數據,不能放緩存。迅速判斷出,請求所攜帶的是否合法有效。 showImg(https://segmentfault.com/img/bVbvHHL?w=1341&h=448); 絕大部分寫業務的程序員,在實際開發中使用 Redis 的時候,只會 Set Value 和...
閱讀 3199·2021-09-29 09:34
閱讀 3551·2021-09-10 10:51
閱讀 1948·2021-09-10 10:50
閱讀 6731·2021-08-12 13:31
閱讀 3000·2019-08-30 15:54
閱讀 1560·2019-08-30 15:44
閱讀 1430·2019-08-29 12:26
閱讀 2654·2019-08-26 18:36