-
Notifications
You must be signed in to change notification settings - Fork 13.1k
bugfix:修复 nacos client 不会回调 listener 方法的问题 #13341
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: develop
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -172,7 +172,7 @@ public ServiceInfo subscribe(String serviceName, String groupName, String cluste | |
if (null == result || !isSubscribed(serviceName, groupName, clusters)) { | ||
result = grpcClientProxy.subscribe(serviceName, groupName, clusters); | ||
} | ||
serviceInfoHolder.processServiceInfo(result); | ||
serviceInfoHolder.processServiceInfo(result, true); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 修正processServiceInfo方法调用参数传递问题
📋 问题详情在subscribe方法中调用processServiceInfo时传递了false作为forceNotify参数。根据设计意图,订阅操作应强制触发监听器通知,此处应传递true以确保事件触发。 💡 解决方案应使用true确保订阅时触发事件: - serviceInfoHolder.processServiceInfo(result, false);
+ serviceInfoHolder.processServiceInfo(result, true); 确保客户端订阅时强制通知监听器更新服务信息。
|
||
return result; | ||
} | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -85,7 +85,7 @@ void testProcessServiceInfo() { | |
hosts.add(instance2); | ||
info.setHosts(hosts); | ||
|
||
ServiceInfo actual1 = holder.processServiceInfo(info); | ||
ServiceInfo actual1 = holder.processServiceInfo(info, false); | ||
assertEquals(info, actual1); | ||
|
||
Instance newInstance1 = createInstance("1.1.1.1", 1); | ||
|
@@ -97,7 +97,7 @@ void testProcessServiceInfo() { | |
ServiceInfo info2 = new ServiceInfo("a@@b@@c"); | ||
info2.setHosts(hosts2); | ||
|
||
ServiceInfo actual2 = holder.processServiceInfo(info2); | ||
ServiceInfo actual2 = holder.processServiceInfo(info2, false); | ||
assertEquals(info2, actual2); | ||
} | ||
|
||
|
@@ -116,7 +116,7 @@ void testProcessServiceInfoEnableClientMetricsTrue() { | |
try (MockedStatic<MetricsMonitor> mockedMetricsMonitor = Mockito.mockStatic(MetricsMonitor.class)) { | ||
mockedMetricsMonitor.when(MetricsMonitor::getServiceInfoMapSizeMonitor).thenReturn(mockGaugeChild); | ||
|
||
holder.processServiceInfo(info); | ||
holder.processServiceInfo(info, false); | ||
|
||
verify(mockGaugeChild, times(1)).set(1); | ||
} | ||
|
@@ -134,7 +134,7 @@ void testProcessServiceInfoEnableClientMetricsFalse() { | |
info.setHosts(hosts); | ||
|
||
try (MockedStatic<MetricsMonitor> mockedMetricsMonitor = Mockito.mockStatic(MetricsMonitor.class)) { | ||
holder.processServiceInfo(info); | ||
holder.processServiceInfo(info, false); | ||
|
||
mockedMetricsMonitor.verify(MetricsMonitor::getServiceInfoMapSizeMonitor, never()); | ||
} | ||
|
@@ -156,7 +156,7 @@ void testProcessServiceInfoEnableClientMetricsNotSet() { | |
try (MockedStatic<MetricsMonitor> mockedMetricsMonitor = Mockito.mockStatic(MetricsMonitor.class)) { | ||
mockedMetricsMonitor.when(MetricsMonitor::getServiceInfoMapSizeMonitor).thenReturn(mockGaugeChild); | ||
|
||
holder.processServiceInfo(info); | ||
holder.processServiceInfo(info, false); | ||
|
||
verify(mockGaugeChild, times(1)).set(1); | ||
} | ||
|
@@ -180,7 +180,7 @@ void testProcessServiceInfoSetThrowsException() { | |
mockedMetricsMonitor.when(MetricsMonitor::getServiceInfoMapSizeMonitor).thenReturn(mockGaugeChild); | ||
doThrow(exception).when(mockGaugeChild).set(anyInt()); | ||
|
||
ServiceInfo actual2 = holder.processServiceInfo(info); | ||
ServiceInfo actual2 = holder.processServiceInfo(info, false); | ||
|
||
assertEquals(info, actual2); | ||
} | ||
|
@@ -208,7 +208,7 @@ private Instance createInstance(String ip, int port) { | |
void testProcessServiceInfo2() { | ||
String json = "{\"groupName\":\"a\",\"name\":\"b\",\"clusters\":\"c\"}"; | ||
|
||
ServiceInfo actual = holder.processServiceInfo(json); | ||
ServiceInfo actual = holder.processServiceInfo(json, false); | ||
ServiceInfo expect = new ServiceInfo("a@@b@@c"); | ||
expect.setJsonFromServer(json); | ||
assertEquals(expect.getKey(), actual.getKey()); | ||
|
@@ -227,19 +227,19 @@ void testProcessServiceInfoWithPushEmpty() throws NacosException { | |
nacosClientProperties.setProperty(PropertyKeyConst.NAMING_PUSH_EMPTY_PROTECTION, "true"); | ||
holder.shutdown(); | ||
holder = new ServiceInfoHolder("aa", "scope-001", nacosClientProperties); | ||
holder.processServiceInfo(oldInfo); | ||
holder.processServiceInfo(oldInfo, false); | ||
|
||
ServiceInfo newInfo = new ServiceInfo("a@@b@@c"); | ||
|
||
final ServiceInfo actual = holder.processServiceInfo(newInfo); | ||
final ServiceInfo actual = holder.processServiceInfo(newInfo, false); | ||
|
||
assertEquals(oldInfo.getKey(), actual.getKey()); | ||
assertEquals(2, actual.getHosts().size()); | ||
} | ||
|
||
@Test | ||
void testProcessNullServiceInfo() { | ||
assertNull(holder.processServiceInfo(new ServiceInfo())); | ||
assertNull(holder.processServiceInfo(new ServiceInfo(), false)); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 补充测试用例覆盖forceNotify为true且无差异的场景
📋 问题详情现有测试用例未覆盖当forceNotify为true但实例差异为false时触发事件的场景,可能导致该逻辑未经过充分测试。 💡 解决方案新增测试用例验证forceNotify强制触发: + @Test
+ void testForceNotifyWithoutDiff() {
+ ServiceInfo oldInfo = new ServiceInfo("test");
+ serviceInfoHolder.processServiceInfo(oldInfo, false);
+ ServiceInfo newInfo = new ServiceInfo("test");
+ serviceInfoHolder.processServiceInfo(newInfo, true);
+ verify(NotifyCenter).publishEvent(any(InstancesChangeEvent.class));
+ } 验证即使无差异时forceNotify=true仍会触发事件。
|
||
} | ||
|
||
@Test | ||
|
@@ -252,10 +252,10 @@ void testProcessServiceInfoForOlder() { | |
hosts.add(instance2); | ||
info.setHosts(hosts); | ||
info.setLastRefTime(System.currentTimeMillis()); | ||
holder.processServiceInfo(info); | ||
holder.processServiceInfo(info, false); | ||
ServiceInfo olderInfo = new ServiceInfo("a@@b@@c"); | ||
olderInfo.setLastRefTime(0L); | ||
final ServiceInfo actual = holder.processServiceInfo(olderInfo); | ||
final ServiceInfo actual = holder.processServiceInfo(olderInfo, false); | ||
assertEquals(olderInfo, actual); | ||
} | ||
|
||
|
@@ -267,7 +267,7 @@ void testGetServiceInfo() { | |
hosts.add(instance1); | ||
info.setHosts(hosts); | ||
|
||
ServiceInfo expect = holder.processServiceInfo(info); | ||
ServiceInfo expect = holder.processServiceInfo(info, false); | ||
String serviceName = "b"; | ||
String groupName = "a"; | ||
ServiceInfo actual = holder.getServiceInfo(serviceName, groupName); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
修复ServiceInfoHolder在serviceKey为null时可能触发无效事件通知的问题
📋 问题详情
在processServiceInfo方法中,当serviceKey为null时,新增的forceNotify分支直接使用oldService参数调用NotifyCenter.publishEvent。但此时oldService可能未初始化(如首次调用),导致传入无效参数。这可能导致事件监听器收到不完整的数据,影响下游服务发现逻辑。
💡 解决方案
需要确保oldService非空后再触发事件:
确保在首次调用时oldService未初始化时不会触发无效事件。
有用意见👍 | 无用意见👎 | 错误意见❌