Fix extended parameter loss in config refresh due to protocol version misuse

pull/1611/head
mingri31164 11 months ago
parent 49da858fb5
commit 50b937351b

@ -18,8 +18,10 @@
package cn.hippo4j.springboot.starter.core; package cn.hippo4j.springboot.starter.core;
import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry; import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry;
import cn.hippo4j.common.model.ThreadPoolParameterInfo;
import cn.hippo4j.springboot.starter.wrapper.ManagerListenerWrapper; import cn.hippo4j.springboot.starter.wrapper.ManagerListenerWrapper;
import cn.hippo4j.common.toolkit.ContentUtil; import cn.hippo4j.common.toolkit.ContentUtil;
import cn.hippo4j.common.toolkit.JSONUtil;
import cn.hippo4j.common.toolkit.Md5Util; import cn.hippo4j.common.toolkit.Md5Util;
import cn.hippo4j.common.toolkit.IncrementalContentUtil; import cn.hippo4j.common.toolkit.IncrementalContentUtil;
import cn.hippo4j.common.constant.Constants; import cn.hippo4j.common.constant.Constants;
@ -58,10 +60,12 @@ public class CacheData {
this.tenantId = tenantId; this.tenantId = tenantId;
this.itemId = itemId; this.itemId = itemId;
this.threadPoolId = threadPoolId; this.threadPoolId = threadPoolId;
this.content = IncrementalContentUtil.getIncrementalContent( // Store full content for listeners to receive complete configuration
ThreadPoolExecutorRegistry.getHolder(threadPoolId).getParameterInfo(), ThreadPoolParameterInfo parameterInfo = ThreadPoolExecutorRegistry.getHolder(threadPoolId).getParameterInfo();
IncrementalContentUtil.PROTOCOL_VERSION); this.content = ContentUtil.getPoolContent(parameterInfo);
this.md5 = getMd5String(content); // Calculate MD5 based on incremental content for version compatibility
String incrementalContent = IncrementalContentUtil.getIncrementalContent(parameterInfo, IncrementalContentUtil.PROTOCOL_VERSION);
this.md5 = getMd5String(incrementalContent);
this.listeners = new CopyOnWriteArrayList<>(); this.listeners = new CopyOnWriteArrayList<>();
} }
@ -97,8 +101,17 @@ public class CacheData {
} }
public void setContent(String content) { public void setContent(String content) {
// Store full content for listeners
this.content = content; this.content = content;
this.md5 = getMd5String(this.content); // Calculate MD5 based on incremental content for version compatibility
try {
ThreadPoolParameterInfo parameterInfo = JSONUtil.parseObject(content, ThreadPoolParameterInfo.class);
String incrementalContent = IncrementalContentUtil.getIncrementalContent(parameterInfo, IncrementalContentUtil.PROTOCOL_VERSION);
this.md5 = getMd5String(incrementalContent);
} catch (Exception e) {
// Fallback to full content MD5 if parsing fails
this.md5 = getMd5String(content);
}
} }
public static String getMd5String(String config) { public static String getMd5String(String config) {

@ -157,9 +157,7 @@ public class ClientWorker implements DisposableBean {
try { try {
String content = getServerConfig(namespace, itemId, tpId, defaultTimedOut); String content = getServerConfig(namespace, itemId, tpId, defaultTimedOut);
CacheData cacheData = cacheMap.get(tpId); CacheData cacheData = cacheMap.get(tpId);
ThreadPoolParameterInfo poolInfo = JSONUtil.parseObject(content, ThreadPoolParameterInfo.class); String poolContent = ContentUtil.getPoolContent(JSONUtil.parseObject(content, ThreadPoolParameterInfo.class));
// Use incremental content for protocol version 2+ clients
String poolContent = IncrementalContentUtil.getIncrementalContent(poolInfo, IncrementalContentUtil.PROTOCOL_VERSION);
cacheData.setContent(poolContent); cacheData.setContent(poolContent);
} catch (Exception ignored) { } catch (Exception ignored) {
log.error("Failed to get the latest thread pool configuration.", ignored); log.error("Failed to get the latest thread pool configuration.", ignored);
@ -288,9 +286,7 @@ public class ClientWorker implements DisposableBean {
try { try {
serverConfig = getServerConfig(namespace, itemId, threadPoolId, defaultTimedOut); serverConfig = getServerConfig(namespace, itemId, threadPoolId, defaultTimedOut);
ThreadPoolParameterInfo poolInfo = JSONUtil.parseObject(serverConfig, ThreadPoolParameterInfo.class); ThreadPoolParameterInfo poolInfo = JSONUtil.parseObject(serverConfig, ThreadPoolParameterInfo.class);
// Use incremental content for protocol version 2+ clients cacheData.setContent(ContentUtil.getPoolContent(poolInfo));
String content = IncrementalContentUtil.getIncrementalContent(poolInfo, IncrementalContentUtil.PROTOCOL_VERSION);
cacheData.setContent(content);
} catch (Exception ex) { } catch (Exception ex) {
log.error("Cache Data Error. Service Unavailable: {}", ex.getMessage()); log.error("Cache Data Error. Service Unavailable: {}", ex.getMessage());
} }

Loading…
Cancel
Save