|
@@ -41,13 +41,17 @@ public class CaseDataCache {
|
|
|
*/
|
|
*/
|
|
|
public static final Map<String, String> GOVERN_CONFIG = Maps.newConcurrentMap();
|
|
public static final Map<String, String> GOVERN_CONFIG = Maps.newConcurrentMap();
|
|
|
|
|
|
|
|
- /** caseId → 案件级缓存 */
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * caseId → 案件级缓存
|
|
|
|
|
+ */
|
|
|
private static final Map<Long, CaseBucket> BUCKETS = new ConcurrentHashMap<>();
|
|
private static final Map<Long, CaseBucket> BUCKETS = new ConcurrentHashMap<>();
|
|
|
|
|
|
|
|
private CaseDataCache() {
|
|
private CaseDataCache() {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /** 单个案件的人员库缓存 */
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 单个案件的人员库缓存
|
|
|
|
|
+ */
|
|
|
private static final class CaseBucket {
|
|
private static final class CaseBucket {
|
|
|
private final HashMultimap<String, String> personLibNoMap = HashMultimap.create();
|
|
private final HashMultimap<String, String> personLibNoMap = HashMultimap.create();
|
|
|
private final Map<String, String> personCard = Maps.newConcurrentMap();
|
|
private final Map<String, String> personCard = Maps.newConcurrentMap();
|
|
@@ -72,7 +76,7 @@ public class CaseDataCache {
|
|
|
initPersonLibNoCache(resolved, bucket);
|
|
initPersonLibNoCache(resolved, bucket);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private static void initPersonLibNoCache(Long caseId, CaseBucket bucket) {
|
|
|
|
|
|
|
+ private static void initPersonLibNoCache(Long caseId, CaseBucket bucket) {
|
|
|
PersonLibNoMapper mapper = SpringUtil.getBean(PersonLibNoMapper.class);
|
|
PersonLibNoMapper mapper = SpringUtil.getBean(PersonLibNoMapper.class);
|
|
|
// 显式绑定案件上下文:查的是案件库,@DS("slave") 需要知道是哪个案件
|
|
// 显式绑定案件上下文:查的是案件库,@DS("slave") 需要知道是哪个案件
|
|
|
List<PersonLibNo> personLibNos = CaseContextHolder.callWith(caseId,
|
|
List<PersonLibNo> personLibNos = CaseContextHolder.callWith(caseId,
|
|
@@ -141,19 +145,25 @@ public class CaseDataCache {
|
|
|
return bucket == null ? Set.of() : bucket.personLibNoMap.get(personName + StrPool.UNDERLINE + 3);
|
|
return bucket == null ? Set.of() : bucket.personLibNoMap.get(personName + StrPool.UNDERLINE + 3);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /** 按手机号取人名 */
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 按手机号取人名
|
|
|
|
|
+ */
|
|
|
public static String getPersonPhone(String phone) {
|
|
public static String getPersonPhone(String phone) {
|
|
|
CaseBucket bucket = bucketOrNull("getPersonPhone");
|
|
CaseBucket bucket = bucketOrNull("getPersonPhone");
|
|
|
return bucket == null ? null : bucket.personPhone.get(phone);
|
|
return bucket == null ? null : bucket.personPhone.get(phone);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /** 按银行卡号取人名 */
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 按银行卡号取人名
|
|
|
|
|
+ */
|
|
|
public static String getPersonCard(String card) {
|
|
public static String getPersonCard(String card) {
|
|
|
CaseBucket bucket = bucketOrNull("getPersonCard");
|
|
CaseBucket bucket = bucketOrNull("getPersonCard");
|
|
|
return bucket == null ? null : bucket.personCard.get(card);
|
|
return bucket == null ? null : bucket.personCard.get(card);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /** 该值(手机号/卡号)是否属于本案件人员库 */
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 该值(手机号/卡号)是否属于本案件人员库
|
|
|
|
|
+ */
|
|
|
public static boolean containsPersonValue(String val) {
|
|
public static boolean containsPersonValue(String val) {
|
|
|
CaseBucket bucket = bucketOrNull("containsPersonValue");
|
|
CaseBucket bucket = bucketOrNull("containsPersonValue");
|
|
|
return bucket != null && bucket.personLibNoMap.containsValue(val);
|
|
return bucket != null && bucket.personLibNoMap.containsValue(val);
|
|
@@ -183,7 +193,9 @@ public class CaseDataCache {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /** 清理指定案件的缓存(退出案件 / 换案时调用) */
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 清理指定案件的缓存(退出案件 / 换案时调用)
|
|
|
|
|
+ */
|
|
|
public static void cleanCache(Long caseId) {
|
|
public static void cleanCache(Long caseId) {
|
|
|
if (caseId == null) {
|
|
if (caseId == null) {
|
|
|
return;
|
|
return;
|
|
@@ -191,7 +203,9 @@ public class CaseDataCache {
|
|
|
BUCKETS.remove(caseId);
|
|
BUCKETS.remove(caseId);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /** 清理全部案件的缓存(应用停止时调用) */
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 清理全部案件的缓存(应用停止时调用)
|
|
|
|
|
+ */
|
|
|
public static void cleanAll() {
|
|
public static void cleanAll() {
|
|
|
BUCKETS.clear();
|
|
BUCKETS.clear();
|
|
|
}
|
|
}
|
|
@@ -216,13 +230,17 @@ public class CaseDataCache {
|
|
|
return caseId;
|
|
return caseId;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /** 写操作用:取不到案件上下文直接抛异常 */
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 写操作用:取不到案件上下文直接抛异常
|
|
|
|
|
+ */
|
|
|
private static CaseBucket requireBucket(String action) {
|
|
private static CaseBucket requireBucket(String action) {
|
|
|
Long caseId = requireCaseId(null, action);
|
|
Long caseId = requireCaseId(null, action);
|
|
|
return BUCKETS.computeIfAbsent(caseId, key -> new CaseBucket());
|
|
return BUCKETS.computeIfAbsent(caseId, key -> new CaseBucket());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /** 读操作用:取不到案件上下文时打日志并返回 null,由调用方降级 */
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 读操作用:取不到案件上下文时打日志并返回 null,由调用方降级
|
|
|
|
|
+ */
|
|
|
private static CaseBucket bucketOrNull(String action) {
|
|
private static CaseBucket bucketOrNull(String action) {
|
|
|
Long caseId = resolveCaseId(null);
|
|
Long caseId = resolveCaseId(null);
|
|
|
if (caseId == null) {
|
|
if (caseId == null) {
|