private <T> void onCommonMultiChanged(final List<T> changedList, final DataEventTypeEnum eventType,
                                          final String configKeyPrefix, final Function<? super T, ? extends String> mappingKey,
                                          final Function<? super T, ? extends String> mappingValue) {
        // Avoiding concurrent operations on list nodes
        final ReentrantLock reentrantLock = listSaveLockMap.computeIfAbsent(configKeyPrefix, key -> new ReentrantLock());
        try {
            reentrantLock.lock();
            final Map<String, List<String>> nameToIdMap = changedList.stream()
                    .collect(Collectors.groupingBy(mappingKey, Collectors.mapping(mappingValue, Collectors.toList())));
            switch (eventType) {
                case DELETE:
                    changedList.forEach(changedData -> delConfig(configKeyPrefix + mappingKey.apply(changedData) + DefaultNodeConstants.JOIN_POINT + mappingValue.apply(changedData)));
                    this.delChangedMapToList(nameToIdMap, configKeyPrefix);
                    break;
                case REFRESH:
                case MYSELF:
                default:
                    changedList.forEach(changedData -> publishConfig(configKeyPrefix + mappingKey.apply(changedData) + DefaultNodeConstants.JOIN_POINT + mappingValue.apply(changedData), changedData));
                    this.putChangedMapToList(nameToIdMap, configKeyPrefix);
                    break;
            }
        } catch (Exception e) {
            LOG.error("AbstractNodeDataChangedListener onCommonMultiChanged error ", e);
        } finally {
            reentrantLock.unlock();
        }
    }
onCommonMultiChanged.
save to configuration center common multi methods.
examples data:
 namespaceId.selector.key1
  -> selector.key1.value1
  -> selector.key1.value2
  -> selector.key1.value3
 namespaceId.selector.key2
  -> selector.key2.value4
  -> selector.key2.value5
  -> selector.key2.value6
@param changedList changedList
@param eventType eventType
@param configKeyPrefix configKeyPrefix
@param mappingKey mappingKey
@param mappingValue mappingValue
shenyu-admin-listener/shenyu-admin-listener-api/src/main/java/org/apache/shenyu/admin/listener/AbstractNodeDataChangedListener.java