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

PowerJob UseCacheLock工作流程源碼剖析

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

本文主要研究一下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維護了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()之前還判斷了一下加鎖耗時,若超過SLOW_THRESHOLD(100ms)則通過monitorService.monitor上報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維護了useCacheLock.type()與Cache的關(guān)系;而Cache的key為lock key,value為ReentrantLock,最后是通過reentrantLock.lockInterruptibly()加鎖。

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

相關(guān)文章

  • springcloud檢索中間件?ElasticSearch?分布式場景的使用

    springcloud檢索中間件?ElasticSearch?分布式場景的使用

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

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

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

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

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

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

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

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

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

    Spring Security OAuth2集成短信驗證碼登錄以及第三方登錄

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

    JavaWeb中Servlet的深入講解

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

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

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

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

    在 MyBatis 中,返回值類型和參數(shù)傳遞是 Mapper 接口中至關(guā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

最新評論

尼勒克县| 冷水江市| 集贤县| 永康市| 乐至县| 探索| 福安市| 鄱阳县| 竹北市| 和田县| 喜德县| 张掖市| 桂东县| 连平县| 囊谦县| 和平县| 醴陵市| 新河县| 西藏| 岐山县| 竹山县| 武乡县| 彝良县| 濮阳市| 尖扎县| 呼玛县| 东光县| 宝鸡市| 丽水市| 延川县| 青浦区| 揭阳市| 张北县| 五大连池市| 吉木乃县| 西华县| 克拉玛依市| 钟山县| 兴业县| 驻马店市| 会同县|