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

PowerJob LockService方法工作流程源碼解讀

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

本文主要研究一下PowerJob的LockService

LockService

tech/powerjob/server/extension/LockService.java

public interface LockService {
    /**
     * 上鎖(獲取鎖),立即返回,不會阻塞等待鎖
     * @param name 鎖名稱
     * @param maxLockTime 最長持有鎖的時間,單位毫秒(ms)
     * @return true -> 獲取到鎖,false -> 未獲取到鎖
     */
    boolean tryLock(String name, long maxLockTime);
    /**
     * 釋放鎖
     * @param name 鎖名稱
     */
    void unlock(String name);
}
LockService接口定義了tryLock、unlock方法

DatabaseLockService

tech/powerjob/server/extension/defaultimpl/DatabaseLockService.java

@Slf4j
@Service
public class DatabaseLockService implements LockService {
    private final String ownerIp;
    private final OmsLockRepository omsLockRepository;
    @Autowired
    public DatabaseLockService(OmsLockRepository omsLockRepository) {
        this.ownerIp = NetUtils.getLocalHost();
        this.omsLockRepository = omsLockRepository;
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            int num = omsLockRepository.deleteByOwnerIP(ownerIp);
            log.info("[DatabaseLockService] execute shutdown hook, release all lock(owner={},num={})", ownerIp, num);
        }));
    }
    @Override
    public boolean tryLock(String name, long maxLockTime) {
        OmsLockDO newLock = new OmsLockDO(name, ownerIp, maxLockTime);
        try {
            omsLockRepository.saveAndFlush(newLock);
            return true;
        } catch (DataIntegrityViolationException ignore) {
        } catch (Exception e) {
            log.warn("[DatabaseLockService] write lock to database failed, lockName = {}.", name, e);
        }
        OmsLockDO omsLockDO = omsLockRepository.findByLockName(name);
        long lockedMillions = System.currentTimeMillis() - omsLockDO.getGmtCreate().getTime();
        // 鎖超時,強制釋放鎖并重新嘗試獲取
        if (lockedMillions > omsLockDO.getMaxLockTime()) {
            log.warn("[DatabaseLockService] The lock[{}] already timeout, will be unlocked now.", omsLockDO);
            unlock(name);
            return tryLock(name, maxLockTime);
        }
        return false;
    }
    @Override
    public void unlock(String name) {
        try {
            CommonUtils.executeWithRetry0(() -> omsLockRepository.deleteByLockName(name));
        }catch (Exception e) {
            log.error("[DatabaseLockService] unlock {} failed.", name, e);
        }
    }
}
DatabaseLockService基于數(shù)據(jù)庫實現(xiàn)了LockService,其構(gòu)造器依賴OmsLockRepository,同時注冊了ShutdownHook,在關(guān)閉的時候執(zhí)行omsLockRepository.deleteByOwnerIP(ownerIp);其tryLock方法創(chuàng)建OmsLockDO,然后執(zhí)行omsLockRepository.saveAndFlush,若成功則返回,若有異常則通過omsLockRepository.findByLockName找到omsLockDO,計算加鎖時間,若超過MaxLockTime則執(zhí)行unlock再重新tryLock;其unlock執(zhí)行omsLockRepository.deleteByLockName

NetUtils.getLocalHost

tech/powerjob/common/utils/NetUtils.java

public static String getLocalHost() {
        if (HOST_ADDRESS != null) {
            return HOST_ADDRESS;
        }
        String addressFromJVM = System.getProperty(PowerJobDKey.BIND_LOCAL_ADDRESS);
        if (StringUtils.isNotEmpty(addressFromJVM)) {
            log.info("[Net] use address from[{}]: {}", PowerJobDKey.BIND_LOCAL_ADDRESS, addressFromJVM);
            return HOST_ADDRESS = addressFromJVM;
        }
        InetAddress address = getLocalAddress();
        if (address != null) {
            return HOST_ADDRESS = address.getHostAddress();
        }
        return LOCALHOST_VALUE;
    }
    public static InetAddress getLocalAddress() {
        if (LOCAL_ADDRESS != null) {
            return LOCAL_ADDRESS;
        }
        InetAddress localAddress = getLocalAddress0();
        LOCAL_ADDRESS = localAddress;
        return localAddress;
    }    
    private static InetAddress getLocalAddress0() {
        // @since 2.7.6, choose the {@link NetworkInterface} first
        try {
            InetAddress addressOp = getFirstReachableInetAddress( findNetworkInterface());
            if (addressOp != null) {
                return addressOp;
            }
        } catch (Throwable e) {
            log.warn("[Net] getLocalAddress0 failed.", e);
        }
        InetAddress localAddress = null;
        try {
            localAddress = InetAddress.getLocalHost();
            Optional<InetAddress> addressOp = toValidAddress(localAddress);
            if (addressOp.isPresent()) {
                return addressOp.get();
            }
        } catch (Throwable e) {
            log.warn("[Net] getLocalAddress0 failed.", e);
        }
        return localAddress;
    }
NetUtils的getLocalHost先判斷HOST_ADDRESS是否有值,有則直接返回,否則先從系統(tǒng)屬性讀取powerjob.network.local.address,讀取不到則取LOCAL_ADDRESS,若LOCAL_ADDRESS為null則通過getLocalAddress0獲取

OmsLockDO

tech/powerjob/server/persistence/remote/model/OmsLockDO.java

@Data
@Entity
@NoArgsConstructor
@Table(uniqueConstraints = {@UniqueConstraint(name = "uidx01_oms_lock", columnNames = {"lockName"})})
public class OmsLockDO {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
    @GenericGenerator(name = "native", strategy = "native")
    private Long id;

    private String lockName;

    private String ownerIP;
    /**
     * 最長持有鎖的時間
     */
    private Long maxLockTime;

    private Date gmtCreate;

    private Date gmtModified;

    public OmsLockDO(String lockName, String ownerIP, Long maxLockTime) {
        this.lockName = lockName;
        this.ownerIP = ownerIP;
        this.maxLockTime = maxLockTime;
        this.gmtCreate = new Date();
        this.gmtModified = this.gmtCreate;
    }
}
OmsLockDO定義lockName為唯一索引,它還定義了ownerIP、maxLockTime

OmsLockRepository

tech/powerjob/server/persistence/remote/repository/OmsLockRepository.java

public interface OmsLockRepository extends JpaRepository&lt;OmsLockDO, Long&gt; {

    @Modifying
    @Transactional(rollbackOn = Exception.class)
    @Query(value = "delete from OmsLockDO where lockName = ?1")
    int deleteByLockName(String lockName);

    OmsLockDO findByLockName(String lockName);

    @Modifying
    @Transactional(rollbackOn = Exception.class)
    int deleteByOwnerIP(String ip);
}
OmsLockRepository繼承了JpaRepository,它定義了deleteByLockName、findByLockName、deleteByOwnerIP方法

小結(jié)

LockService接口定義了tryLock、unlock方法;DatabaseLockService基于數(shù)據(jù)庫實現(xiàn)了LockService,其構(gòu)造器依賴OmsLockRepository,同時注冊了ShutdownHook,在關(guān)閉的時候執(zhí)行omsLockRepository.deleteByOwnerIP(ownerIp);其tryLock方法創(chuàng)建OmsLockDO,然后執(zhí)行omsLockRepository.saveAndFlush,若成功則返回,若有異常則通過omsLockRepository.findByLockName找到omsLockDO,計算加鎖時間,若超過MaxLockTime則執(zhí)行unlock再重新tryLock;其unlock執(zhí)行omsLockRepository.deleteByLockName。

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

相關(guān)文章

  • Java數(shù)據(jù)結(jié)構(gòu)之樹和二叉樹的相關(guān)資料

    Java數(shù)據(jù)結(jié)構(gòu)之樹和二叉樹的相關(guān)資料

    這篇文章主要介紹了Java?數(shù)據(jù)結(jié)構(gòu)之樹和二叉樹相關(guān)資料,文中通過示例代碼和一些相關(guān)題目來做介紹,非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下!
    2023-01-01
  • Java中List常用操作比for循環(huán)更優(yōu)雅的寫法示例

    Java中List常用操作比for循環(huán)更優(yōu)雅的寫法示例

    List是Java中比較常用的集合類,關(guān)于List接口有很多實現(xiàn)類,下面這篇文章主要給大家介紹了關(guān)于Java中List常用操作比for循環(huán)更優(yōu)雅的寫法,需要的朋友可以參考下
    2021-11-11
  • java的nio的使用示例分享

    java的nio的使用示例分享

    這篇教程展示了5個在Java編程的一些常見場景里使用NIO和NIO.2包的簡單示例,需要的朋友可以參考下
    2014-03-03
  • Java設(shè)置PDF跨頁表格重復(fù)顯示表頭行的步驟詳解

    Java設(shè)置PDF跨頁表格重復(fù)顯示表頭行的步驟詳解

    這篇文章主要給大家介紹了關(guān)于Java設(shè)置PDF跨頁表格重復(fù)顯示表頭行的相關(guān)資料,這里使用的是Free Spire.PDF for Java的jar包,Spire.PDF for Java 是一款專門對 PDF 文檔進行操作的 Java 類庫,需要的朋友可以參考下
    2021-07-07
  • SpringBoot Maven升級自帶的jar包版本問題

    SpringBoot Maven升級自帶的jar包版本問題

    這篇文章主要介紹了SpringBoot Maven升級自帶的jar包版本問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Mybatis結(jié)果生成鍵值對的實例代碼

    Mybatis結(jié)果生成鍵值對的實例代碼

    這篇文章主要介紹了Mybatis結(jié)果生成鍵值對的實例代碼,以及MyBatis返回Map鍵值對數(shù)據(jù)的實現(xiàn)方法,非常不錯,具有參考借鑒價值,需要的的朋友參考下
    2017-02-02
  • java數(shù)據(jù)類型轉(zhuǎn)換陷阱包括列表陷阱

    java數(shù)據(jù)類型轉(zhuǎn)換陷阱包括列表陷阱

    這篇文章主要介紹了java數(shù)據(jù)類型轉(zhuǎn)換的一些陷阱,包括基本數(shù)據(jù)類型轉(zhuǎn)換列表陷阱,基本上這一篇就把常見的問題就給大家分享一下
    2020-10-10
  • Java線程優(yōu)先級變量及功能

    Java線程優(yōu)先級變量及功能

    這篇文章主要介紹了Java線程優(yōu)先級變量及功能,關(guān)于優(yōu)先級的問可能有兩個或更多線程被分配了相同的優(yōu)先級,那么它們的執(zhí)行取決于操作系統(tǒng),更多相關(guān)介紹,需要的小伙伴可以參考一下
    2022-06-06
  • Java定時器問題實例解析

    Java定時器問題實例解析

    這篇文章主要結(jié)合實例介紹了java當(dāng)中的定時器的一些問題,有需要的朋友可以參考一下
    2017-04-04
  • Java多線程事務(wù)回滾@Transactional失效處理方案

    Java多線程事務(wù)回滾@Transactional失效處理方案

    這篇文章主要介紹了Java多線程事務(wù)回滾@Transactional失效處理方案,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-08-08

最新評論

临沧市| 文成县| 鹤壁市| 富民县| 横山县| 建水县| 平果县| 依兰县| 和林格尔县| 沁阳市| 喜德县| 平塘县| 历史| 普格县| 昌江| 萨迦县| 海林市| 永修县| 上林县| 长白| 平远县| 盘锦市| 通城县| 登封市| 朝阳市| 卢龙县| 永修县| 万荣县| 沂水县| 湖州市| 昌江| 桐柏县| 和龙市| 无棣县| 墨竹工卡县| 松江区| 兰州市| 塔河县| 和硕县| 双桥区| 泰兴市|