fix(nacos-client:config): fix issue 1317
This commit is contained in:
parent
0f72a349c5
commit
240ee50aa2
@ -36,6 +36,18 @@ public interface ConfigService {
|
|||||||
*/
|
*/
|
||||||
String getConfig(String dataId, String group, long timeoutMs) throws NacosException;
|
String getConfig(String dataId, String group, long timeoutMs) throws NacosException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get config
|
||||||
|
*
|
||||||
|
* @param dataId dataId
|
||||||
|
* @param group group
|
||||||
|
* @param timeoutMs read timeout
|
||||||
|
* @param listener {@link Listener}
|
||||||
|
* @return config value
|
||||||
|
* @throws NacosException NacosException
|
||||||
|
*/
|
||||||
|
String getConfigAndSignListener(String dataId, String group, long timeoutMs, Listener listener) throws NacosException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a listener to the configuration, after the server modified the
|
* Add a listener to the configuration, after the server modified the
|
||||||
* configuration, the client will use the incoming listener callback.
|
* configuration, the client will use the incoming listener callback.
|
||||||
|
@ -27,6 +27,7 @@ import com.alibaba.nacos.client.config.filter.impl.ConfigResponse;
|
|||||||
import com.alibaba.nacos.client.config.http.HttpAgent;
|
import com.alibaba.nacos.client.config.http.HttpAgent;
|
||||||
import com.alibaba.nacos.client.config.http.MetricsHttpAgent;
|
import com.alibaba.nacos.client.config.http.MetricsHttpAgent;
|
||||||
import com.alibaba.nacos.client.config.http.ServerHttpAgent;
|
import com.alibaba.nacos.client.config.http.ServerHttpAgent;
|
||||||
|
import com.alibaba.nacos.client.config.impl.CacheData;
|
||||||
import com.alibaba.nacos.client.config.impl.ClientWorker;
|
import com.alibaba.nacos.client.config.impl.ClientWorker;
|
||||||
import com.alibaba.nacos.client.config.impl.HttpSimpleClient.HttpResult;
|
import com.alibaba.nacos.client.config.impl.HttpSimpleClient.HttpResult;
|
||||||
import com.alibaba.nacos.client.config.impl.LocalConfigInfoProcessor;
|
import com.alibaba.nacos.client.config.impl.LocalConfigInfoProcessor;
|
||||||
@ -122,6 +123,13 @@ public class NacosConfigService implements ConfigService {
|
|||||||
return getConfigInner(namespace, dataId, group, timeoutMs);
|
return getConfigInner(namespace, dataId, group, timeoutMs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getConfigAndSignListener(String dataId, String group, long timeoutMs, Listener listener) throws NacosException {
|
||||||
|
String content = getConfig(dataId, group, timeoutMs);
|
||||||
|
worker.addTenantListenersWithContent(dataId, group, content, Arrays.asList(listener));
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addListener(String dataId, String group, Listener listener) throws NacosException {
|
public void addListener(String dataId, String group, Listener listener) throws NacosException {
|
||||||
worker.addTenantListeners(dataId, group, Arrays.asList(listener));
|
worker.addTenantListeners(dataId, group, Arrays.asList(listener));
|
||||||
@ -166,6 +174,12 @@ public class NacosConfigService implements ConfigService {
|
|||||||
content = worker.getServerConfig(dataId, group, tenant, timeoutMs);
|
content = worker.getServerConfig(dataId, group, tenant, timeoutMs);
|
||||||
|
|
||||||
cr.setContent(content);
|
cr.setContent(content);
|
||||||
|
|
||||||
|
CacheData cacheData = worker.getCache(dataId, group, tenant);
|
||||||
|
if (cacheData != null) {
|
||||||
|
cacheData.setContent(content);
|
||||||
|
}
|
||||||
|
|
||||||
configFilterChainManager.doFilter(null, cr);
|
configFilterChainManager.doFilter(null, cr);
|
||||||
content = cr.getContent();
|
content = cr.getContent();
|
||||||
|
|
||||||
|
@ -66,6 +66,7 @@ public class CacheData {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Add listener
|
* Add listener
|
||||||
|
* if CacheData already set new content, Listener should init lastCallMd5 by CacheData.md5
|
||||||
*
|
*
|
||||||
* @param listener listener
|
* @param listener listener
|
||||||
*/
|
*/
|
||||||
@ -74,6 +75,7 @@ public class CacheData {
|
|||||||
throw new IllegalArgumentException("listener is null");
|
throw new IllegalArgumentException("listener is null");
|
||||||
}
|
}
|
||||||
ManagerListenerWrap wrap = new ManagerListenerWrap(listener);
|
ManagerListenerWrap wrap = new ManagerListenerWrap(listener);
|
||||||
|
wrap.lastCallMd5 = md5;
|
||||||
if (listeners.addIfAbsent(wrap)) {
|
if (listeners.addIfAbsent(wrap)) {
|
||||||
LOGGER.info("[{}] [add-listener] ok, tenant={}, dataId={}, group={}, cnt={}", name, tenant, dataId, group,
|
LOGGER.info("[{}] [add-listener] ok, tenant={}, dataId={}, group={}, cnt={}", name, tenant, dataId, group,
|
||||||
listeners.size());
|
listeners.size());
|
||||||
@ -167,6 +169,8 @@ public class CacheData {
|
|||||||
final Listener listener = listenerWrap.listener;
|
final Listener listener = listenerWrap.listener;
|
||||||
|
|
||||||
Runnable job = new Runnable() {
|
Runnable job = new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
ClassLoader myClassLoader = Thread.currentThread().getContextClassLoader();
|
ClassLoader myClassLoader = Thread.currentThread().getContextClassLoader();
|
||||||
ClassLoader appClassLoader = listener.getClass().getClassLoader();
|
ClassLoader appClassLoader = listener.getClass().getClassLoader();
|
||||||
@ -284,7 +288,7 @@ public class CacheData {
|
|||||||
|
|
||||||
class ManagerListenerWrap {
|
class ManagerListenerWrap {
|
||||||
final Listener listener;
|
final Listener listener;
|
||||||
String lastCallMd5 = CacheData.getMd5String(null);
|
volatile String lastCallMd5 = CacheData.getMd5String(null);
|
||||||
|
|
||||||
ManagerListenerWrap(Listener listener) {
|
ManagerListenerWrap(Listener listener) {
|
||||||
this.listener = listener;
|
this.listener = listener;
|
||||||
|
@ -91,6 +91,16 @@ public class ClientWorker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addTenantListenersWithContent(String dataId, String group, String content, List<? extends Listener> listeners) {
|
||||||
|
group = null2defaultGroup(group);
|
||||||
|
String tenant = agent.getTenant();
|
||||||
|
CacheData cache = addCacheDataIfAbsent(dataId, group, tenant);
|
||||||
|
cache.setContent(content);
|
||||||
|
for (Listener listener : listeners) {
|
||||||
|
cache.addListener(listener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void removeTenantListener(String dataId, String group, Listener listener) {
|
public void removeTenantListener(String dataId, String group, Listener listener) {
|
||||||
group = null2defaultGroup(group);
|
group = null2defaultGroup(group);
|
||||||
String tenant = agent.getTenant();
|
String tenant = agent.getTenant();
|
||||||
|
@ -435,6 +435,44 @@ public class ConfigAPI_ITCase {
|
|||||||
iconfig.removeListener(dataId, group, ml);
|
iconfig.removeListener(dataId, group, ml);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @TCDescription : nacos_在主动拉取配置后并注册Listener,在更新配置后才触发Listener监听事件
|
||||||
|
* @TestStep : TODO Test steps
|
||||||
|
* @ExpectResult : TODO expect results
|
||||||
|
* @author xiaochun.xxc
|
||||||
|
* @since 3.6.8
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void nacos_addListener_5() throws InterruptedException, NacosException {
|
||||||
|
final AtomicInteger count = new AtomicInteger(0);
|
||||||
|
final String content = "test-abc";
|
||||||
|
final String newContent = "new-test-def";
|
||||||
|
boolean result = iconfig.publishConfig(dataId, group, content);
|
||||||
|
Assert.assertTrue(result);
|
||||||
|
|
||||||
|
Thread.sleep(3000);
|
||||||
|
|
||||||
|
Listener ml = new AbstractListener() {
|
||||||
|
@Override
|
||||||
|
public void receiveConfigInfo(String configInfo) {
|
||||||
|
count.incrementAndGet();
|
||||||
|
System.out.println("Listener receive : [" + configInfo + "]");
|
||||||
|
Assert.assertEquals(content, newContent);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
String receiveContent = iconfig.getConfigAndSignListener(dataId, group, 1000, ml);
|
||||||
|
System.out.println(receiveContent);
|
||||||
|
|
||||||
|
result = iconfig.publishConfig(dataId, group, newContent);
|
||||||
|
Assert.assertTrue(result);
|
||||||
|
|
||||||
|
Assert.assertEquals(content, receiveContent);
|
||||||
|
Thread.sleep(3000);
|
||||||
|
|
||||||
|
Assert.assertEquals(1, count.get());
|
||||||
|
iconfig.removeListener(dataId, group, ml);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @TCDescription : nacos_正常移除监听器
|
* @TCDescription : nacos_正常移除监听器
|
||||||
* @TestStep : TODO Test steps
|
* @TestStep : TODO Test steps
|
||||||
|
Loading…
Reference in New Issue
Block a user