<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## 一、概述 對應單JVM部署的應用,我們用synchronized或java.util.concurrent.locks.Lock都可以解決一段待,同時只能一個線程調用的問題,非常簡單; 但如果考慮到多個組件分布式部署,這些組件分布在不同的JVM中,那么,顯然用上面的辦法無法解決多線程同步的問題; 平臺提供了RayLocker分布鎖解決方案來解決這個問題; ## 二、技術方案 ``` @Autowired private RayLocker rayLocker; ``` 分布鎖示范代碼: ``` String traceMethodPerIpKey = getCurrentRequestUniqueKey(joinPoint); if (rayLocker.lock(traceMethodPerIpKey)) { try { object = joinPoint.proceed(args); } finally { rayLocker.unlock(traceMethodPerIpKey); } } else { throw new RayRequestRepeatedException(); } ``` ## 三、舉例 如果你需要控制某個業務的同步,比如同一個對象,不能被多個組件同時修改,那么,用RayLocker機制很容易解決;代碼結構可以參考上面的情況,只需要找到合適的lockKey即可; 舉例,我們需要控制對一個賬號的修改。那么,主程序中,要修改賬號的地方,用賬號的id作為鎖的key,開始處理的時候加鎖,處理完也必須釋放鎖;如果同時,在調度服務器中,也需要修改對象,那么很簡單,調度服務程序中修改賬號的地方,同樣用賬號的id作為鎖的key,開始處理的時候加鎖,處理完也必須釋放鎖;這樣,就完美的實現了在多個JVM的分布式部署程序中實現同步; ``` @Autowired private RayLocker rayLocker; @Transactional public void refresh(SysStaff staff) throws InterruptedException { String today = DateUtil.getDateStr(5); String lockKey = today + staff.getStaffId(); if (rayLocker.lock(lockKey)) { try { RsaleStaffProfitStatDaily daily = rsaleStaffProfitStatDailyDao.findByStaffIdAndProfitDate(staff.getStaffId(), today); if (daily == null) { daily = new RsaleStaffProfitStatDaily(); daily.setProfitDate(today); daily.setStaffId(staff.getStaffId()); daily.setInvitedDirectProfit(0L); daily.setInvitedTeamProfit(0L); daily.setMerchanDirectProfit(0L); daily.setMerchanTeamProfit(0L); } daily.setMerchanDirectProfit(daily.getMerchanDirectProfit() + settleMerchantDirect(staff.getStaffId(), today).longValue()); daily.setMerchanTeamProfit(daily.getMerchanTeamProfit() + settleMerchantTeam(staff.getStaffId(), today).longValue()); rsaleStaffProfitStatDailyDao.save(daily); } finally { rayLocker.unlock(lockKey); } } } ``` >[danger] 注意,多個JVM中程序控制同樣對象的時候,lockKey必須一樣,否則沒有意義;
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看