From 7c2f69ddcc1a35a314768bae203b7bd5df875429 Mon Sep 17 00:00:00 2001
From: 6c <420680616@qq.com>
Date: 星期四, 18 九月 2025 10:29:31 +0800
Subject: [PATCH] 请求历史特殊处理-若是多次维修导致报表库数据重复,那么按照主键取最新数据
---
product-server-data-center/src/main/java/com/product/data/center/utils/CustomLock.java | 179 +++++++++++++++++++++++++++++++++++++++--------------------
1 files changed, 119 insertions(+), 60 deletions(-)
diff --git a/product-server-data-center/src/main/java/com/product/data/center/utils/CustomLock.java b/product-server-data-center/src/main/java/com/product/data/center/utils/CustomLock.java
index b1f1981..6336553 100644
--- a/product-server-data-center/src/main/java/com/product/data/center/utils/CustomLock.java
+++ b/product-server-data-center/src/main/java/com/product/data/center/utils/CustomLock.java
@@ -1,12 +1,18 @@
package com.product.data.center.utils;
import cn.hutool.core.collection.ConcurrentHashSet;
+import cn.hutool.core.date.DateUtil;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.ArrayUtil;
import com.product.core.spring.context.SpringMVCContextHolder;
import org.apache.commons.lang3.StringUtils;
+import javax.swing.*;
+import java.text.DateFormat;
+import java.util.Date;
+import java.util.Map;
import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
/**
* @Author cheng
@@ -16,87 +22,140 @@
public class CustomLock {
- private Set<String> obj = new ConcurrentHashSet<>();
+ private Map<String, Long> obj = new ConcurrentHashMap<>();
+ private Map<String, Long> threadObj = new ConcurrentHashMap<>();
- private long detectionWaitTime = 1000L;
+ private long detectionWaitTime = 1000L;
- /**
- * 鏃犲弬鏋勯�犳椂
- */
- public CustomLock() {
- }
+ /**
+ * 鏃犲弬鏋勯�犳椂
+ */
+ public CustomLock() {
+ }
- /**
- * @param detectionWaitTime 妫�娴嬬瓑寰呮椂闂达紝鍗曚綅姣
- */
- public CustomLock(long detectionWaitTime) {
- this.detectionWaitTime = detectionWaitTime;
- }
+ /**
+ * @param detectionWaitTime 妫�娴嬬瓑寰呮椂闂达紝鍗曚綅姣
+ */
+ public CustomLock(long detectionWaitTime) {
+ this.detectionWaitTime = detectionWaitTime;
+ }
- public boolean tryLock(String[] key) {
- return this.tryLock(ArrayUtil.join(key, ","));
- }
+ public boolean tryLock(String[] key) {
+ return this.tryLock(ArrayUtil.join(key, ","));
+ }
- public boolean tryLock(String key) {
- if (!StringUtils.isEmpty(key)) {
- key = key.toUpperCase();
- synchronized (key.intern()) {
- if (!this.obj.contains(key)) {
- lock(key);
- return true;
- }
- }
- }
- return false;
- }
+ public static void main(String[] args) {
+ long timemillis = 1709654400039L;
+ //杞崲涓哄勾鏈堟棩鏃跺垎绉�
+ String format = DateUtil.format(DateUtil.date(timemillis), "yyyy-MM-dd HH:mm:ss");
+
+ System.out.println(format);
+ }
+
+ public boolean tryLock(String key, long timeoutMinute) {
+ if (!StringUtils.isEmpty(key)) {
+ key = key.toUpperCase();
+ synchronized (key.intern()) {
+ if (!this.obj.containsKey(key)) {
+ lock(key);
+ //鑾峰彇褰撳墠绾跨▼
+ long id = Thread.currentThread().getId();
+ threadObj.put(key, id);
+ return true;
+ } else if (timeoutMinute > 0) {
+ //鑾峰彇閿佽繘鍏ュ紑濮嬫椂闂�
+ long startTime = obj.get(key);
+ //鑾峰彇褰撳墠鏃堕棿
+ long currentTime = System.currentTimeMillis();
+
+ //灏嗗垎閽熻浆鎹负姣
+ long timeout = timeoutMinute * 60 * 1000;
+ //濡傛灉褰撳墠鏃堕棿鍑忓幓寮�濮嬫椂闂村ぇ浜庣瓑浜庤秴鏃舵椂闂�
+ if (currentTime - startTime >= timeout) {
+ long threadId = threadObj.get(key);
+ //鏍规嵁绾跨▼id鑾峰彇绾跨▼
+ Thread[] threads = ThreadUtil.getThreads();
+ for (Thread thread : threads) {
+ if (thread.getId() == threadId) {
+ //涓柇绾跨▼
+ ThreadUtil.interrupt(thread, true);
+ SpringMVCContextHolder.getSystemLogger().error("绾跨▼锛�" + thread.getName() + "瓒呮椂琚腑鏂�");
+ return tryLock(key, timeoutMinute);
+ }
+ }
+ return true;
+ }
+
+ }
+ }
+ }
+ return false;
+ }
- public void lock(String... key) {
- this.lock(ArrayUtil.join(key, ","));
- }
+ public boolean tryLock(String key) {
+ if (!StringUtils.isEmpty(key)) {
+ key = key.toUpperCase();
+ synchronized (key.intern()) {
+ if (!this.obj.containsKey(key)) {
+ lock(key);
+ //鑾峰彇褰撳墠绾跨▼
+ long id = Thread.currentThread().getId();
+ threadObj.put(key, id);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
- public void lock(String key) {
- String obj = key;
- if (StringUtils.isEmpty(obj)) {
- return;
- }
- obj = obj.toUpperCase();
+
+ public void lock(String... key) {
+ this.lock(ArrayUtil.join(key, ","));
+ }
+
+ public void lock(String key) {
+ String obj = key;
+ if (StringUtils.isEmpty(obj)) {
+ return;
+ }
+ obj = obj.toUpperCase();
// boolean enterLock = false;
- long starTime = System.currentTimeMillis();
- Long outLogTime = null;
- while (this.obj.contains(obj)) {
- if (System.currentTimeMillis() - starTime >= (1000 * 60 * 5)) {
- if (outLogTime == null || System.currentTimeMillis() - outLogTime >= (1000 * 60)) {
- outLogTime = System.currentTimeMillis();
- SpringMVCContextHolder.getSystemLogger().error("绛夊緟閲婃斁閿佹椂闂磋秴杩�5鍒嗛挓,绛夊緟鏃堕棿锛�" + (System.currentTimeMillis() - starTime) + "ms,lockKey:" + obj);
- }
- }
+ long starTime = System.currentTimeMillis();
+ Long outLogTime = null;
+ while (this.obj.containsKey(obj)) {
+ if (System.currentTimeMillis() - starTime >= (1000 * 60 * 5)) {
+ if (outLogTime == null || System.currentTimeMillis() - outLogTime >= (1000 * 60)) {
+ outLogTime = System.currentTimeMillis();
+ SpringMVCContextHolder.getSystemLogger().error("绛夊緟閲婃斁閿佹椂闂磋秴杩�5鍒嗛挓,绛夊緟鏃堕棿锛�" + (System.currentTimeMillis() - starTime) + "ms,lockKey:" + obj);
+ }
+ }
// enterLock = true;
// SpringMVCContextHolder.getSystemLogger().info("閿侀噴鏀剧瓑寰�,lockKey:" + obj);
- ThreadUtil.sleep(this.detectionWaitTime);
- }
+ ThreadUtil.sleep(this.detectionWaitTime);
+ }
// if (enterLock) {
// SpringMVCContextHolder.getSystemLogger().info("绛夊緟瀹氭椂闂达細" + (System.currentTimeMillis() - starTime) + " ms,lockKey:" + obj);
// }
// SpringMVCContextHolder.getSystemLogger().info("涓婇攣鎴愬姛,lockKey:" + obj);
- this.obj.add(obj);
- }
+ this.obj.put(obj, System.currentTimeMillis());
+ }
- public void unLock(String... key) {
- String obj = ArrayUtil.join(key, ",");
- unLock(obj);
- }
+ public void unLock(String... key) {
+ String obj = ArrayUtil.join(key, ",");
+ unLock(obj);
+ }
- public void unLock(String key) {
+ public void unLock(String key) {
- if (StringUtils.isEmpty(key)) {
- return;
- }
- this.obj.remove(key.toUpperCase());
+ if (StringUtils.isEmpty(key)) {
+ return;
+ }
+ this.obj.remove(key.toUpperCase());
// SpringMVCContextHolder.getSystemLogger().info("閲婃斁閿佹垚鍔�,lockKey:" + key);
- }
+ }
}
--
Gitblit v1.9.2