亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

redis分布式鎖解決集群服務器定時任務重復執(zhí)行問題

ethernet / 3809人閱讀

摘要:當觸發(fā)定時任務時,一臺服務的任務進入切面,通過方法為唯一的加鎖,如果當前不存在,將放入緩存,并返回通過設置鎖超時時間,結束后跳出執(zhí)行定時任務方法。

問題描述

將帶有定時任務的項目部署在單臺測試環(huán)境上,完全沒問題。生產上是兩臺集群服務器,項目部署上去發(fā)現(xiàn)定時任務的模塊同時在兩臺機器上各執(zhí)行了一遍,這將會導致其他意外的發(fā)生。

解決方案----redis分布式鎖

使用redis分布式鎖,為定時任務唯一指定的key加鎖,并設置鎖超時時間。當觸發(fā)定時任務時,一臺服務的任務進入切面,通過setNX(key,value)方法為唯一的key加鎖,如果當前key不存在,將放入緩存,并返回true,通過expire(key,second)設置鎖超時時間,結束后跳出執(zhí)行定時任務方法。第二臺服務任務進入時,設置鎖的時候發(fā)現(xiàn)該鎖已存在于緩存,并返回false,不跳轉到執(zhí)行定時任務方法。

核心代碼

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 {

    /**
     * 執(zhí)行定時任務
     **/
    @Scheduled(cron = "0 0 1 * * ?")
    @CacheLock(lockedPrefix = "TimeTaskService",expireTime=30)
    public void executeTask() {
        System.out.println("hello world!");
    }

}

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://www.ezyhdfw.cn/yun/72599.html

相關文章

  • 考拉定時任務框架kSchedule

    摘要:考拉訂單流推送申報單推送物流信息等供應鏈相關業(yè)務已接入分片任務,極大提高了業(yè)務吞吐量降低壓力,提升了通關效率。支撐雙十一黑五雙十二等大促,高峰期統(tǒng)一暫停非關鍵定時任務,讓出系統(tǒng)資源,提高業(yè)務系統(tǒng)穩(wěn)定性。 此文已由作者楊凱明授權網易云社區(qū)發(fā)布。 歡迎訪問網易云社區(qū),了解更多網易技術產品運營經驗。 1.背景 目前項目中使用的定時任務框架存在下面這些問題 沒有統(tǒng)一的定時任務管理平臺 目前項目...

    AlexTuan 評論0 收藏0
  • 布式機制原理及實現(xiàn)方式

    摘要:分布式鎖實現(xiàn)方式前言目前幾乎很多大型網站及應用都是分布式部署的,分布式場景中的數(shù)據一致性問題一直是一個比較重要的話題?;跀?shù)據庫實現(xiàn)分布式鎖基于緩存等實現(xiàn)分布式鎖基于實現(xiàn)分布式鎖。 前言 分布式鎖,是控制分布式系統(tǒng)之間同步訪問共享資源的一種方式 在分布式系統(tǒng)中,常常需要協(xié)調他們的動作。如果不同的系統(tǒng)或是同一個系統(tǒng)的不同主機之間共享了一個或一組資源,那么訪問這些資源的時候,往往需要互斥...

    yacheng 評論0 收藏0
  • 布式機制原理及實現(xiàn)方式

    摘要:分布式鎖實現(xiàn)方式前言目前幾乎很多大型網站及應用都是分布式部署的,分布式場景中的數(shù)據一致性問題一直是一個比較重要的話題?;跀?shù)據庫實現(xiàn)分布式鎖基于緩存等實現(xiàn)分布式鎖基于實現(xiàn)分布式鎖。 前言 分布式鎖,是控制分布式系統(tǒng)之間同步訪問共享資源的一種方式 在分布式系統(tǒng)中,常常需要協(xié)調他們的動作。如果不同的系統(tǒng)或是同一個系統(tǒng)的不同主機之間共享了一個或一組資源,那么訪問這些資源的時候,往往需要互斥...

    Travis 評論0 收藏0
  • 七道常見的Redis面試題分享

    摘要:綜合上述缺點,小明痛定思痛,提出了經營方式二。當客戶下單,小明按送達地點標注好,依次放在一個地方。因此,有強一致性要求的數(shù)據,不能放緩存。迅速判斷出,請求所攜帶的是否合法有效。 showImg(https://segmentfault.com/img/bVbvHHL?w=1341&h=448); 絕大部分寫業(yè)務的程序員,在實際開發(fā)中使用 Redis 的時候,只會 Set Value 和...

    zhiwei 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<