Browse Source

细化锁粒度

menglu 3 years ago
parent
commit
cd00cbe8a8

+ 9 - 0
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/data/SceneDataValue.java

@@ -1,5 +1,8 @@
 package com.persagy.ibms.data.sdk.data;
 
+import java.util.Date;
+import java.util.concurrent.locks.ReentrantLock;
+
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.serializer.SerializerFeature;
@@ -17,6 +20,9 @@ public class SceneDataValue {
 	public SceneDataSet value_array;
 	public SceneDataPrimitive value_prim;
 
+	public Date last_compute_time;
+	public ReentrantLock lock;
+
 	public SceneDataValue(Repository Repository, SceneDataObject parentObjectData, String myPropertyName, SceneProperty rel_property) {
 		this.parentObjectData = parentObjectData;
 		this.myPropertyName = myPropertyName;
@@ -29,6 +35,9 @@ public class SceneDataValue {
 					Repository.property2SDV.get(this.rel_property).add(this);
 				}
 			}
+			if (this.rel_property.propertyValueType.equals("query")) {
+				this.lock = new ReentrantLock(true);
+			}
 		}
 
 		if (this.rel_property != null) {

+ 4 - 4
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/util/ComputeUtil.java

@@ -2,19 +2,19 @@ package com.persagy.ibms.data.sdk.util;
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.locks.ReentrantLock;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.persagy.ibms.data.sdk.data.SceneDataObject;
+import com.persagy.ibms.data.sdk.data.SceneDataPrimitive;
+import com.persagy.ibms.data.sdk.data.SceneDataSet;
 import com.persagy.ibms.data.sdk.data.SceneDataValue;
 import com.persagy.ibms.data.sdk.data.SceneObject;
 import com.persagy.ibms.data.sdk.data.SceneProperty;
-import com.persagy.ibms.data.sdk.data.SceneDataPrimitive;
-import com.persagy.ibms.data.sdk.data.SceneDataSet;
 import com.sagacloud.ExpressionUtil;
 import com.sagacloud.advanced.expression.AdvancedExpressionScanner;
 import com.sagacloud.advanced.expression.AdvancedExpressionWalker;
@@ -191,7 +191,6 @@ public class ComputeUtil {
 		for (List<SceneProperty> spInnerList : spListList) {
 			log.info("********************************");
 			for (SceneProperty spInner2 : spInnerList) {
-				Repository.property2lock.put(spInner2, new ReentrantLock(true));
 				log.info(getPropertyPath(Repository, spInner2));
 				if (!Repository.property2SDV.containsKey(spInner2)) {
 					Repository.property2SDV.put(spInner2, new ArrayList<SceneDataValue>());
@@ -525,6 +524,7 @@ public class ComputeUtil {
 			}
 			Repository.deamon_sdv2pointList.put(sv, pointList);
 		}
+		sv.last_compute_time = new Date();
 	}
 
 	public static Object getValueObject(Repository Repository, String[] valuePath) {

+ 7 - 4
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/util/RecursiveUtil.java

@@ -383,12 +383,15 @@ public class RecursiveUtil {
 		if (sv.rel_property != null && sv.rel_property.propertyValueType.equals("query")) {
 			if (sv.value_object != null && sv.value_object.getRowChange() || sv.value_array != null && sv.value_array.getRowChange()
 					|| sv.value_prim != null && sv.value_prim.getRowChange()) {
-				ReentrantLock lock = Repository.property2lock.get(sv.rel_property);
+				ReentrantLock lock = sv.lock;
 				try {
 					lock.lock();
-					// String svPath = RecursiveUtil.getDataPath(sv);
-					// log.info(svPath);
-					ComputeUtil.computeProperty(Repository, sv);
+					Date currTime = new Date();
+					if (sv.last_compute_time == null || currTime.getTime() - sv.last_compute_time.getTime() > 1000L) {
+						// String svPath = RecursiveUtil.getDataPath(sv);
+						// log.info(svPath);
+						ComputeUtil.computeProperty(Repository, sv);
+					}
 				} finally {
 					lock.unlock();
 				}

+ 1 - 4
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/util/Repository.java

@@ -4,14 +4,13 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.locks.ReentrantLock;
 
 import com.alibaba.fastjson.JSONObject;
 import com.persagy.ibms.data.sdk.data.SceneDataObject;
+import com.persagy.ibms.data.sdk.data.SceneDataSet;
 import com.persagy.ibms.data.sdk.data.SceneDataValue;
 import com.persagy.ibms.data.sdk.data.SceneObject;
 import com.persagy.ibms.data.sdk.data.SceneProperty;
-import com.persagy.ibms.data.sdk.data.SceneDataSet;
 import com.sagacloud.advanced.expression.AdvancedExpressionScanner;
 import com.sagacloud.advanced.expression.AdvancedExpressionWalker;
 
@@ -62,8 +61,6 @@ public class Repository {
 	// 属性到sdv清单
 	public boolean property2SDV_enable = true;
 	public Map<SceneProperty, List<SceneDataValue>> property2SDV = new HashMap<SceneProperty, List<SceneDataValue>>();
-	// 属性到锁
-	public Map<SceneProperty, ReentrantLock> property2lock = new HashMap<SceneProperty, ReentrantLock>();
 
 	// 公用target,减少解析量
 	public Map<String, SceneDataSet> targetListMap = new HashMap<String, SceneDataSet>();