(fix)(headless)Fix concurrent modification exception issue.

This commit is contained in:
jerryjzhang
2025-09-22 15:59:35 +08:00
parent 2d39ebf38b
commit 3dd53bad89
7 changed files with 21 additions and 18 deletions

View File

@@ -33,6 +33,7 @@ import java.util.Objects;
import java.util.PriorityQueue; import java.util.PriorityQueue;
import java.util.TreeMap; import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.PriorityBlockingQueue;
import static com.hankcs.hanlp.utility.Predefine.logger; import static com.hankcs.hanlp.utility.Predefine.logger;
@@ -40,7 +41,7 @@ public class MultiCustomDictionary extends DynamicCustomDictionary {
public static int MAX_SIZE = 10; public static int MAX_SIZE = 10;
public static Boolean removeDuplicates = true; public static Boolean removeDuplicates = true;
public static ConcurrentHashMap<String, PriorityQueue<Term>> NATURE_TO_VALUES = public static ConcurrentHashMap<String, PriorityBlockingQueue<Term>> NATURE_TO_VALUES =
new ConcurrentHashMap<>(); new ConcurrentHashMap<>();
private static boolean addToSuggesterTrie = true; private static boolean addToSuggesterTrie = true;
@@ -146,9 +147,10 @@ public class MultiCustomDictionary extends DynamicCustomDictionary {
} }
for (int i = 0; i < attribute.nature.length; i++) { for (int i = 0; i < attribute.nature.length; i++) {
Nature nature = attribute.nature[i]; Nature nature = attribute.nature[i];
PriorityQueue<Term> priorityQueue = NATURE_TO_VALUES.get(nature.toString()); PriorityBlockingQueue<Term> priorityQueue =
NATURE_TO_VALUES.get(nature.toString());
if (Objects.isNull(priorityQueue)) { if (Objects.isNull(priorityQueue)) {
priorityQueue = new PriorityQueue<>(MAX_SIZE, priorityQueue = new PriorityBlockingQueue<>(MAX_SIZE,
Comparator.comparingInt(Term::getFrequency).reversed()); Comparator.comparingInt(Term::getFrequency).reversed());
NATURE_TO_VALUES.put(nature.toString(), priorityQueue); NATURE_TO_VALUES.put(nature.toString(), priorityQueue);
} }

View File

@@ -24,6 +24,7 @@ import java.util.PriorityQueue;
import java.util.Set; import java.util.Set;
import java.util.TreeMap; import java.util.TreeMap;
import java.util.TreeSet; import java.util.TreeSet;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Slf4j @Slf4j
@@ -200,7 +201,7 @@ public class SearchService {
public static List<String> getDimensionValue(DimensionValueReq dimensionValueReq) { public static List<String> getDimensionValue(DimensionValueReq dimensionValueReq) {
String nature = DictWordType.NATURE_SPILT + dimensionValueReq.getModelId() String nature = DictWordType.NATURE_SPILT + dimensionValueReq.getModelId()
+ DictWordType.NATURE_SPILT + dimensionValueReq.getElementID(); + DictWordType.NATURE_SPILT + dimensionValueReq.getElementID();
PriorityQueue<Term> terms = MultiCustomDictionary.NATURE_TO_VALUES.get(nature); PriorityBlockingQueue<Term> terms = MultiCustomDictionary.NATURE_TO_VALUES.get(nature);
if (CollectionUtils.isEmpty(terms)) { if (CollectionUtils.isEmpty(terms)) {
return new ArrayList<>(); return new ArrayList<>();
} }

View File

@@ -144,7 +144,8 @@ public class PromptHelper {
dimensionStr.append(" ALIAS '").append(alias).append("'"); dimensionStr.append(" ALIAS '").append(alias).append("'");
} }
if (Objects.nonNull(dimension.getExtInfo().get(DIMENSION_DATA_TYPE))) { if (Objects.nonNull(dimension.getExtInfo().get(DIMENSION_DATA_TYPE))) {
dimensionStr.append(" DATATYPE '").append(dimension.getExtInfo().get(DIMENSION_DATA_TYPE)).append("'"); dimensionStr.append(" DATATYPE '")
.append(dimension.getExtInfo().get(DIMENSION_DATA_TYPE)).append("'");
} }
if (StringUtils.isNotEmpty(dimension.getTimeFormat())) { if (StringUtils.isNotEmpty(dimension.getTimeFormat())) {
dimensionStr.append(" FORMAT '").append(dimension.getTimeFormat()).append("'"); dimensionStr.append(" FORMAT '").append(dimension.getTimeFormat()).append("'");

View File

@@ -47,7 +47,8 @@ public class SqlQueryParser implements QueryParser {
SqlQuery sqlQuery = queryStatement.getSqlQuery(); SqlQuery sqlQuery = queryStatement.getSqlQuery();
List<String> queryFields = SqlSelectHelper.getAllSelectFields(sqlQuery.getSql()); List<String> queryFields = SqlSelectHelper.getAllSelectFields(sqlQuery.getSql());
Set<String> queryAliases = SqlSelectHelper.getAliasFields(sqlQuery.getSql()); Set<String> queryAliases = SqlSelectHelper.getAliasFields(sqlQuery.getSql());
List<Pair<String, String>> ontologyMetricsDimensionsAndBizName = Collections.synchronizedList(new ArrayList<>()); List<Pair<String, String>> ontologyMetricsDimensionsAndBizName =
Collections.synchronizedList(new ArrayList<>());
queryFields.removeAll(queryAliases); queryFields.removeAll(queryAliases);
Ontology ontology = queryStatement.getOntology(); Ontology ontology = queryStatement.getOntology();
OntologyQuery ontologyQuery = buildOntologyQuery(ontology, queryFields); OntologyQuery ontologyQuery = buildOntologyQuery(ontology, queryFields);

View File

@@ -519,7 +519,7 @@ public class DimensionServiceImpl extends ServiceImpl<DimensionDOMapper, Dimensi
private DataItem getDataItem(DimensionDO dimensionDO) { private DataItem getDataItem(DimensionDO dimensionDO) {
ModelResp modelResp = modelService.getModel(dimensionDO.getModelId()); ModelResp modelResp = modelService.getModel(dimensionDO.getModelId());
if(modelResp == null) { if (modelResp == null) {
return null; return null;
} }
DimensionResp dimensionResp = DimensionConverter.convert2DimensionResp(dimensionDO, DimensionResp dimensionResp = DimensionConverter.convert2DimensionResp(dimensionDO,
@@ -530,10 +530,8 @@ public class DimensionServiceImpl extends ServiceImpl<DimensionDOMapper, Dimensi
} }
private DataEvent getDataEvent(List<DimensionDO> dimensionDOS, EventType eventType) { private DataEvent getDataEvent(List<DimensionDO> dimensionDOS, EventType eventType) {
List<DataItem> dataItems = List<DataItem> dataItems = dimensionDOS.stream().map(this::getDataItem)
dimensionDOS.stream().map(this::getDataItem) .filter(Objects::nonNull).collect(Collectors.toList());
.filter(Objects::nonNull)
.collect(Collectors.toList());
return new DataEvent(this, dataItems, eventType); return new DataEvent(this, dataItems, eventType);
} }

View File

@@ -682,10 +682,8 @@ public class MetricServiceImpl extends ServiceImpl<MetricDOMapper, MetricDO>
} }
private DataEvent getDataEvent(List<MetricDO> metricDOS, EventType eventType) { private DataEvent getDataEvent(List<MetricDO> metricDOS, EventType eventType) {
List<DataItem> dataItems = List<DataItem> dataItems = metricDOS.stream().map(this::getDataItem)
metricDOS.stream().map(this::getDataItem) .filter(Objects::nonNull).collect(Collectors.toList());
.filter(Objects::nonNull)
.collect(Collectors.toList());
return new DataEvent(this, dataItems, eventType); return new DataEvent(this, dataItems, eventType);
} }

View File

@@ -96,8 +96,9 @@ public class DataSetSchemaBuilder {
Set<SchemaElement> dimensions = new HashSet<>(); Set<SchemaElement> dimensions = new HashSet<>();
Map<Long, Map<String, String>> dataTypeMap = Maps.newHashMap(); Map<Long, Map<String, String>> dataTypeMap = Maps.newHashMap();
for (ModelResp modelResp : resp.getModelResps()) { for (ModelResp modelResp : resp.getModelResps()) {
dataTypeMap.put(modelResp.getId(), modelResp.getModelDetail().getFields().stream() dataTypeMap.put(modelResp.getId(),
.collect(Collectors.toMap(Field::getFieldName, Field::getDataType, (k1, k2) -> k2))); modelResp.getModelDetail().getFields().stream().collect(Collectors
.toMap(Field::getFieldName, Field::getDataType, (k1, k2) -> k2)));
} }
for (DimSchemaResp dim : resp.getDimensions()) { for (DimSchemaResp dim : resp.getDimensions()) {
@@ -119,7 +120,8 @@ public class DataSetSchemaBuilder {
dimToAdd.getExtInfo().put(DimensionConstants.DIMENSION_TYPE, dim.getType()); dimToAdd.getExtInfo().put(DimensionConstants.DIMENSION_TYPE, dim.getType());
// data type // data type
if (dim.getDataType() != null) { if (dim.getDataType() != null) {
dimToAdd.getExtInfo().put(DimensionConstants.DIMENSION_DATA_TYPE, dim.getDataType()); dimToAdd.getExtInfo().put(DimensionConstants.DIMENSION_DATA_TYPE,
dim.getDataType());
} else { } else {
dimToAdd.getExtInfo().put(DimensionConstants.DIMENSION_DATA_TYPE, dimToAdd.getExtInfo().put(DimensionConstants.DIMENSION_DATA_TYPE,
dataTypeMap.get(dim.getModelId()).get(dim.getBizName())); dataTypeMap.get(dim.getModelId()).get(dim.getBizName()));