zm
2020-05-18 a18bfacbf56b401f6e0fdae8710fbca4df8cff77
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package cn.autoform.web.controller.resumable.redis.impl;
 
import cn.autoform.fw.exception.IEMRuntimeException;
import cn.autoform.web.controller.resumable.redis.CacheTool;
import cn.autoform.web.controller.resumable.redis.FormLock;
import cn.autoform.web.controller.resumable.redis.lock.Lock;
import cn.autoform.web.controller.resumable.redis.lock.LocksEntity;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
 
import javax.annotation.Resource;
import java.io.Serializable;
 
/**
 * 表单锁实现类
 * @author wangyuxin
 *
 */
@Service
public class FormLockImpl implements FormLock {
 
    @Resource
    @Setter
    private CacheTool<Serializable> jedisCluster;
    
    @Value("${form.lock.time}")
    @Setter
    private long lockTime;
    
    /**
     * 表单锁的缓存key
     */
    public static final String LOCK_FORMAT = "form_%s_%d_%d_%d";
    
    /*
     * 获取表单锁
     */
    @Override
    public String getLock(String formId, Integer dataRowNum, Integer tenantId, Integer companyId) {
        String cacheKey;
        LocksEntity locks = jedisCluster.get(cacheKey = getKey(formId, dataRowNum, tenantId, companyId), LocksEntity.class);
        if(locks == null) {
            locks = new LocksEntity();
        }
        Lock lock = locks.addLock();
        jedisCluster.add(cacheKey, locks);
        return lock.getLockInfo();
    }
 
    @Override
    public String getKey(String formId, Integer dataRowNum, Integer tenantId, Integer companyId, String lockInfo) {
        System.out.println("时间是多少:"+lockTime);
        String cacheKey;
        LocksEntity locks = jedisCluster.get(cacheKey = getKey(formId, dataRowNum, tenantId, companyId), LocksEntity.class);
        if(locks == null) {
            throw new IEMRuntimeException("FORM_UPDATE");
        }
        Lock lock = locks.addKey(lockInfo, System.currentTimeMillis() + lockTime);
        jedisCluster.add(cacheKey, locks);
        return lock.getKey().getKeyInfo();
    }
 
    @Override
    public void unLock(String formId, Integer dataRowNum, Integer tenantId, Integer companyId, String lock,
            String key) {
        String cacheKey;
        LocksEntity locks = jedisCluster.get(cacheKey = getKey(formId, dataRowNum, tenantId, companyId), LocksEntity.class);
//        System.out.println(JSONTool.toJson(locks));
        if(locks == null 
                || locks.getLock() == null 
                || !locks.getLock().getLockInfo().equals(lock) 
                || !locks.getLock().getKey().getKeyInfo().equals(key)) {
            throw new IEMRuntimeException("FORM_UPDATE");
        }
        jedisCluster.delete(cacheKey);
    }
 
    public String getKey(String formId, Integer dataRowNum, Integer tenantId, Integer companyId) {
        return String.format(LOCK_FORMAT, formId, dataRowNum, tenantId, companyId);
    }
 
    @Override
    public Integer getLockSize(String formId, Integer dataRowNum, Integer tenantId, Integer companyId) {
        LocksEntity locks = jedisCluster.get(getKey(formId, dataRowNum, tenantId, companyId), LocksEntity.class);
        if(locks == null) {
            return 0;
        }
        return locks.getLocks().size();
    }
 
}