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

spring項目對某條單據(jù)進行加鎖處理的方法

 更新時間:2024年11月22日 09:40:46   作者:大黃烽  
這篇文章主要給大家介紹了關于spring項目對某條單據(jù)進行加鎖處理的相關資料,用于對工單單據(jù)進行加鎖和解鎖處理,以防止多用戶同時編輯同一單據(jù),前端傳遞參數(shù)包括單據(jù)ID、類型、鎖超時時間等,后端通過Redis實現(xiàn)鎖機制,需要的朋友可以參考下

最近工作中有個對工單單據(jù)進行加鎖/解鎖處理,目的是為了防止多用戶對同一條單據(jù)處理。以下是完整的前后端代碼。

前端JS billLock.js

let orderLock = {
    orderLock:(viewmodel, id, billType)=>{
        var url = '/orderLock/lock?domainKey='+viewmodel.getDomainKey();
        var proxy = cb.rest.DynamicProxy.create({
            ensure: {url: url, method: 'POST'}
        });
        let data = {"id":id, "billType": billType, "ttl": 60*60*12}
        proxy.ensure(data, function (err, result) {
            if (err) {
                cb.utils.alert(err.message, 'error');
            } else {
                cb.utils.alert(result, 'info');
                if(viewmodel.originalViewMeta.cBillNo && viewmodel.originalViewMeta.cBillNo=="02924ed1"){
                    //維修領料頁面進入
                    if(result.indexOf('成功') <= 0){
                          viewmodel.biz.action().common.browse(viewmodel)
                          viewmodel.biz.action().common.setMode(viewmodel,"browse");  
                          
                    }
                }else{
                    if(result.indexOf('成功') <= 0){
                        viewmodel.biz.action().common.browse(viewmodel)
                    }
                }
                
            }
        })
    },

    unOrderLock:(viewmodel, id, billType)=>{
        var url = '/orderLock/unLock?domainKey='+viewmodel.getDomainKey();
        var proxy = cb.rest.DynamicProxy.create({
            ensure: {url: url, method: 'POST'}
        });
        var data = {"id":id, "billType": billType}
        proxy.ensure(data, function (err, result) {
            if (err) {
                cb.utils.alert(err.message, 'error');
            } else {
                cb.utils.alert(result, 'info');
            }
        })
    }
}
export default orderLock

后端Java 代碼

@RestController
@RequestMapping("/orderLock")
@Slf4j
public class OrderLockController extends BaseController {
    @Autowired
    private GmsRedisUtil gmsRRedisUtil;
    @Autowired
    private UserInfoService userInfoService;

    private String ENGINE_NO = "afterservice";

    /**
     * 加鎖
     */
    @PostMapping(value = "/lock")
    public void orderLock(@RequestBody OrderLockDTO orderLockDTO, HttpServletResponse response) {
        try{
            String result;
            UserExtendDto userExtendDto = userInfoService.getUserExtend();
            String nowDate = DateUtil.dateFormat(PartCommonConstants.dateTimeFormatter, LocalDateTime.now());
            String key = ENGINE_NO + "_" + orderLockDTO.getBillType() + "_" + orderLockDTO.getId();
            String message = "鎖定人["+userExtendDto.getStaffName()+"]鎖定時間["+nowDate+"]";
            Boolean flag = gmsRRedisUtil.tryGetLock(key, message, orderLockDTO.getTtl(), 2);
            if(flag){
                result = "加鎖成功!";
            }else{
                String lockValue = gmsRRedisUtil.getObject(key);
                if(lockValue.contains(userExtendDto.getStaffName())){
                    result = "加鎖成功!原鎖定用戶["+userExtendDto.getStaffName()+"]進入單據(jù)!";
                }else{
                    result = "加鎖失敗!單據(jù)已被鎖定,"+lockValue;
                }
            }
            renderJson(response, ResultMessage.data(result,false));
        }catch(Exception e){
            renderJson(response, ResultMessage.error(e.getMessage()));
            log.error("加鎖失敗:{}",e);
        }
    }

代碼解析(以上代碼大致步驟如下:)

1. 前端代碼 參數(shù)是data,帶有id,billtype,字符串ttl,時間變量 4個參數(shù)穿入后端。

2.后端接收參數(shù),調用gmsRRedisUtil.tryGetLock,這個方法是項目框架自己封裝,原理是實現(xiàn)了redisTemplate.opsForValue().setIfAbsent方法

3.setIfAbsent方法簡單介紹如下:

1.setIfAbsent(K var1, V var2);
如果key不存在則新增,key存在不做任何操作
redisTemplate.opsForValue().setIfAbsent("BBB", "好的");

2.setIfAbsent(K var1, V var2, long var3, TimeUnit var5)
如果key不存在則新增,同時設置過期時間,key存在不做任何操作。
redisTemplate.opsForValue().setIfAbsent("AAA", "好的", 1, TimeUnit.MINUTES);

3.setIfAbsent(K key, V value, Duration timeout)
如果key不存在則新增,同時設置過期時間,key存在不做任何操作。
redisTemplate.opsForValue().setIfAbsent("BBB", "好的", Duration.ofMinutes(1));

4.如果單據(jù)第一次進入,key不存在,flag為true,直接返回給前端“加鎖成功”,前端解析字符串中含有“成功,不設置頁面為瀏覽態(tài),仍為編輯態(tài)

本次加鎖我調用的是第2個方法,這里的第一個參數(shù)key可見是單據(jù)id加一些特定字符。所以單據(jù)id就會被加鎖,并設置加鎖時間\

5 如果單據(jù)在已經(jīng)加鎖的情況下,仍有其他用戶編輯此單據(jù),則key重復,gmsRRedisUtil.tryGetLock不做操作。

    gmsRRedisUtil.getObject(key)實際是調用redisTemplate.opsForValue().get(key) 方法,
    其中 get(Object var1)  是獲取指定的key對應的值。
    第一次加鎖的message是用戶信息,這里如果是不同用戶登錄的話,
    if(lockValue.contains(userExtendDto.getStaffName())) 就為false,返回給前端的信息是“加鎖失敗...”,
    前端獲取字符串信息中沒有加鎖成功,會設置頁面為瀏覽態(tài),不能編輯。 到此,加鎖完成!

總結 

到此這篇關于spring項目對某條單據(jù)進行加鎖處理的文章就介紹到這了,更多相關spring某條單據(jù)加鎖處理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java使用itextpdf實現(xiàn)生成PDF并添加圖片,水印和文字

    Java使用itextpdf實現(xiàn)生成PDF并添加圖片,水印和文字

    這篇文章主要為大家詳細介紹了Java在使用itextpdf實現(xiàn)生成PDF時如何實現(xiàn)添加圖片,水印和文字等效果,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-02-02
  • Spring事務失效的9大場景與解決方法

    Spring事務失效的9大場景與解決方法

    在日常開發(fā)中,我們經(jīng)常使用Spring事務,這篇文章主要來和大家聊聊Spring事務失效的 9 種場景,并提供了相應的解決方法,有需要的小伙伴可以參考一下
    2025-04-04
  • java 值Document解析xml詳細介紹

    java 值Document解析xml詳細介紹

    這篇文章主要介紹了java 值Document解析xml詳細介紹的相關資料,需要的朋友可以參考下
    2017-05-05
  • java動態(tài)口令登錄實現(xiàn)過程詳解

    java動態(tài)口令登錄實現(xiàn)過程詳解

    這篇文章主要介紹了java動態(tài)口令登錄實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • Java 如何快速,優(yōu)雅的實現(xiàn)導出Excel

    Java 如何快速,優(yōu)雅的實現(xiàn)導出Excel

    這篇文章主要介紹了Java 如何快速,優(yōu)雅的實現(xiàn)導出Excel,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下
    2021-03-03
  • JavaEE初階教程之Java?IO流讀寫與文件操作實戰(zhàn)

    JavaEE初階教程之Java?IO流讀寫與文件操作實戰(zhàn)

    在Java編程中IO流是進行文件讀寫操作的重要組成部分,IO流提供了一種靈活、可靠的方式來處理文件和數(shù)據(jù)流,這篇文章主要介紹了JavaEE初階教程之Java?IO流讀寫與文件操作實戰(zhàn)的相關資料,需要的朋友可以參考下
    2025-12-12
  • java實現(xiàn)文件斷點續(xù)傳下載功能

    java實現(xiàn)文件斷點續(xù)傳下載功能

    這篇文章主要為大家詳細介紹了java實現(xiàn)文件斷點續(xù)傳下載功能的具體代碼,感興趣的小伙伴們可以參考一下
    2016-05-05
  • shade解決mybatis包沖突問題及項目引用的方法

    shade解決mybatis包沖突問題及項目引用的方法

    這篇文章主要介紹了shade解決mybatis包沖突問題及項目引用的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Java 常見的限流算法詳細分析并實現(xiàn)

    Java 常見的限流算法詳細分析并實現(xiàn)

    大數(shù)據(jù)量高并發(fā)訪問時,經(jīng)常出現(xiàn)服務或接口面對暴漲的請求而不可用的情況,甚至引發(fā)連鎖反映導致整個系統(tǒng)崩潰。此時你需要使用的技術手段之一就是限流,當請求達到一定的并發(fā)數(shù)或速率,就進行等待、排隊、降級、拒絕服務等。限流時,常見算法是計數(shù)器、漏斗、令牌桶算法
    2022-04-04
  • 詳解 Java靜態(tài)代理

    詳解 Java靜態(tài)代理

    這篇文章主要介紹了 Java靜態(tài)代理的相關資料,幫助大家更好的理解和學習Java代理的知識,感興趣的朋友可以了解下
    2020-08-08

最新評論

九寨沟县| 云梦县| 满城县| 泰和县| 舞钢市| 镇原县| 新乡市| 缙云县| 蓬安县| 客服| 沾益县| 海阳市| 来宾市| 丰城市| 古浪县| 顺平县| 阿荣旗| 樟树市| 明星| 中山市| 溆浦县| 巫溪县| 简阳市| 三门峡市| 榆中县| 彭泽县| 水城县| 东辽县| 贵州省| 兴义市| 永济市| 兴山县| 长垣县| 剑河县| 海门市| 九江县| 南阳市| 灵台县| 冀州市| 广东省| 松溪县|