最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PowerJob UseCacheLock工作流程源碼剖析

 更新時(shí)間:2024年01月15日 09:10:28   作者:codecraft  
這篇文章主要為大家介紹了PowerJob UseCacheLock工作流程源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

本文主要研究一下PowerJob的UseCacheLock

UseCacheLock

tech/powerjob/server/core/lock/UseCacheLock.java

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCacheLock {
    String type();
    String key();
    int concurrencyLevel();
}
UseCacheLock注解定義了type、key、concurrencyLevel屬性

UseCacheLockAspect

tech/powerjob/server/core/lock/UseCacheLockAspect.java

@Slf4j
@Aspect
@Component
@Order(1)
@RequiredArgsConstructor
public class UseCacheLockAspect {
    private final MonitorService monitorService;
    private final Map<String, Cache<String, ReentrantLock>> lockContainer = Maps.newConcurrentMap();
    private static final long SLOW_THRESHOLD = 100;
    @Around(value = "@annotation(useCacheLock))")
    public Object execute(ProceedingJoinPoint point, UseCacheLock useCacheLock) throws Throwable {
        Cache<String, ReentrantLock> lockCache = lockContainer.computeIfAbsent(useCacheLock.type(), ignore -> {
            int concurrencyLevel = useCacheLock.concurrencyLevel();
            log.info("[UseSegmentLockAspect] create Lock Cache for [{}] with concurrencyLevel: {}", useCacheLock.type(), concurrencyLevel);
            return CacheBuilder.newBuilder()
                    .initialCapacity(300000)
                    .maximumSize(500000)
                    .concurrencyLevel(concurrencyLevel)
                    .expireAfterWrite(30, TimeUnit.MINUTES)
                    .build();
        });
        final Method method = AOPUtils.parseMethod(point);
        Long key = AOPUtils.parseSpEl(method, point.getArgs(), useCacheLock.key(), Long.class, 1L);
        final ReentrantLock reentrantLock = lockCache.get(String.valueOf(key), ReentrantLock::new);
        long start = System.currentTimeMillis();
        reentrantLock.lockInterruptibly();
        try {
            long timeCost = System.currentTimeMillis() - start;
            if (timeCost > SLOW_THRESHOLD) {
                final SlowLockEvent slowLockEvent = new SlowLockEvent()
                        .setType(SlowLockEvent.Type.LOCAL)
                        .setLockType(useCacheLock.type())
                        .setLockKey(String.valueOf(key))
                        .setCallerService(method.getDeclaringClass().getSimpleName())
                        .setCallerMethod(method.getName())
                        .setCost(timeCost);
                monitorService.monitor(slowLockEvent);
                log.warn("[UseSegmentLockAspect] wait lock for method({}#{}) cost {} ms! key = '{}', args = {}, ", method.getDeclaringClass().getSimpleName(), method.getName(), timeCost,
                        key,
                        JSON.toJSONString(point.getArgs()));
            }
            return point.proceed();
        } finally {
            reentrantLock.unlock();
        }
    }
}
UseCacheLockAspect攔截@UseCacheLock注解,它定義了lockContainer維護(hù)了useCacheLock.type()與Cache的關(guān)系;Cache采用的guava的Cache,其initialCapacity為300000,maximumSize為500000,expireAfterWrite為30分鐘;Cache的key為lock key,value為ReentrantLock;其execute方法主要是先執(zhí)行reentrantLock.lockInterruptibly(),然后執(zhí)行point.proceed(),最后reentrantLock.unlock();執(zhí)行point.proceed()之前還判斷了一下加鎖耗時(shí),若超過SLOW_THRESHOLD(100ms)則通過monitorService.monitor上報(bào)SlowLockEvent

示例

@UseCacheLock(type = "processJobInstance", key = "#instanceId", concurrencyLevel = 1024)
    public void redispatchAsync(Long instanceId, int originStatus) {
        // 將狀態(tài)重置為等待派發(fā)
        instanceInfoRepository.updateStatusAndGmtModifiedByInstanceIdAndOriginStatus(instanceId, originStatus, InstanceStatus.WAITING_DISPATCH.getV(), new Date());
    }
key支持SpEl

小結(jié)

PowerJob的UseCacheLock注解定義了type、key、concurrencyLevel屬性;UseCacheLockAspect攔截@UseCacheLock注解,它定義了lockContainer維護(hù)了useCacheLock.type()與Cache的關(guān)系;而Cache的key為lock key,value為ReentrantLock,最后是通過reentrantLock.lockInterruptibly()加鎖。

以上就是PowerJob UseCacheLock工作流程源碼剖析的詳細(xì)內(nèi)容,更多關(guān)于PowerJob UseCacheLock的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • springcloud檢索中間件?ElasticSearch?分布式場(chǎng)景的使用

    springcloud檢索中間件?ElasticSearch?分布式場(chǎng)景的使用

    單機(jī)的elasticsearch做數(shù)據(jù)存儲(chǔ),必然面臨兩個(gè)問題:海量數(shù)據(jù)存儲(chǔ)問題、單點(diǎn)故障問題,本文重點(diǎn)給大家介紹springcloud檢索中間件?ElasticSearch?分布式場(chǎng)景的運(yùn)用,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • Java定時(shí)器通信協(xié)議管理模塊Timer詳解

    Java定時(shí)器通信協(xié)議管理模塊Timer詳解

    這篇文章主要介紹了Java定時(shí)器通信協(xié)議管理模塊Timer,?Timer一般指定時(shí)器(通信協(xié)議管理模塊)人類最早使用的定時(shí)工具是沙漏或水漏,但在鐘表誕生發(fā)展成熟之后,人們開始嘗試使用這種全新的計(jì)時(shí)工具來改進(jìn)定時(shí)器,達(dá)到準(zhǔn)確控制時(shí)間的目的
    2022-08-08
  • java使用udp實(shí)現(xiàn)簡(jiǎn)單多人聊天功能

    java使用udp實(shí)現(xiàn)簡(jiǎn)單多人聊天功能

    這篇文章主要為大家詳細(xì)介紹了java使用udp實(shí)現(xiàn)簡(jiǎn)單多人聊天功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • SpringBoot多模塊項(xiàng)目創(chuàng)建和初始化問題

    SpringBoot多模塊項(xiàng)目創(chuàng)建和初始化問題

    本文詳細(xì)介紹了使用SpringBoot框架創(chuàng)建一個(gè)包含數(shù)據(jù)庫操作、MyBatis-Plus、Knife4j、HTTP請(qǐng)求響應(yīng)等的Java Web項(xiàng)目的步驟和配置方法,內(nèi)容涵蓋創(chuàng)建項(xiàng)目結(jié)構(gòu)、配置數(shù)據(jù)庫連接、添加依賴、編寫接口、處理異常、序列化和反序列化、配置接口文檔等等內(nèi)容
    2026-05-05
  • java使用單向鏈表解決數(shù)據(jù)存儲(chǔ)自定義排序問題

    java使用單向鏈表解決數(shù)據(jù)存儲(chǔ)自定義排序問題

    本文主要介紹了java使用單向鏈表解決數(shù)據(jù)存儲(chǔ)自定義排序問題,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Spring Security OAuth2集成短信驗(yàn)證碼登錄以及第三方登錄

    Spring Security OAuth2集成短信驗(yàn)證碼登錄以及第三方登錄

    這篇文章主要介紹了Spring Security OAuth2集成短信驗(yàn)證碼登錄以及第三方登錄,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • JavaWeb中Servlet的深入講解

    JavaWeb中Servlet的深入講解

    這篇文章主要介紹了JavaWeb中Servlet的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • SpringBoot整合MongoDB的實(shí)現(xiàn)代碼

    SpringBoot整合MongoDB的實(shí)現(xiàn)代碼

    自己本科時(shí)候一直使用的是Mysql,目前的課題組使用的是MongoDB,因此就花了一部分時(shí)間整理了一下,實(shí)現(xiàn)springboot與MongoDB的整合,并且實(shí)現(xiàn)基本的增刪改查操作,從頭到尾給出一個(gè)完整的案例。
    2021-05-05
  • Mybatis 返回值類型和參數(shù)傳遞的配置方法

    Mybatis 返回值類型和參數(shù)傳遞的配置方法

    在 MyBatis 中,返回值類型和參數(shù)傳遞是 Mapper 接口中至關(guān)重要的兩個(gè)方面,正確理解和使用它們可以幫助我們高效、準(zhǔn)確地進(jìn)行數(shù)據(jù)庫操作,接下來通過本文給大家介紹Mybatis 返回值類型和參數(shù)傳遞的配置方法,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • JDK8中stream常用方法操作大全

    JDK8中stream常用方法操作大全

    JDK 1.8引入的Stream API是Java函數(shù)式編程的核心特性,它提供了一種高效、聲明式的方式來處理集合數(shù)據(jù),常見的終止操作包括遍歷、收集、歸約等,這篇文章給大家介紹JDK8中stream常用方法操作大全,感興趣的朋友一起看看吧
    2026-01-01

最新評(píng)論

道孚县| 东辽县| 壤塘县| 仁寿县| 金湖县| 丰宁| 谷城县| 邵武市| 海晏县| 喜德县| 阿坝| 新乡县| 姜堰市| 东安县| 玉环县| 买车| 乌兰浩特市| 任丘市| 富锦市| 上高县| 宁明县| 容城县| 盖州市| 饶河县| 大渡口区| 鲜城| 读书| 高雄市| 奎屯市| 灵武市| 清徐县| 鸡泽县| 吉木萨尔县| 黄浦区| 南汇区| 印江| 甘泉县| 观塘区| 合山市| 枞阳县| 延吉市|