This is an automated email from the ASF dual-hosted git repository.
youling1128 pushed a commit to branch 2.9.x
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git
The following commit(s) were added to refs/heads/2.9.x by this push:
new 738139b46 [#5065] fixed cannot immediately pull service instances when
watched registry-center service instance changed problem (#5066) (#5067)
738139b46 is described below
commit 738139b467609630c4ef5a92b68cf47ebb668ad1
Author: Alex <[email protected]>
AuthorDate: Sat Jan 31 10:01:34 2026 +0800
[#5065] fixed cannot immediately pull service instances when watched
registry-center service instance changed problem (#5066) (#5067)
---
.github/workflows/maven.yml | 2 +-
.github/workflows/unit-test-jdk17.yml | 2 +-
.github/workflows/unit-test-jdk21.yml | 2 +-
.../service/center/client/DiscoveryEvents.java | 46 ++++++++++++++++
.../service/center/client/ServiceCenterClient.java | 3 +-
.../center/client/ServiceCenterDiscovery.java | 62 +++++++++++++++++++++-
.../center/client/ServiceCenterOperation.java | 3 +-
.../service/center/client/ServiceCenterWatch.java | 2 +-
8 files changed, 112 insertions(+), 10 deletions(-)
diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
index 5788af888..d566e7e27 100644
--- a/.github/workflows/maven.yml
+++ b/.github/workflows/maven.yml
@@ -36,7 +36,7 @@ jobs:
- name: Set up jdk
uses: actions/setup-java@v3
with:
- java-version: '17'
+ java-version: '17.0.2'
distribution: 'temurin'
- name: Set up Maven
uses: stCarolas/[email protected]
diff --git a/.github/workflows/unit-test-jdk17.yml
b/.github/workflows/unit-test-jdk17.yml
index 1e66fae53..ebc920c23 100644
--- a/.github/workflows/unit-test-jdk17.yml
+++ b/.github/workflows/unit-test-jdk17.yml
@@ -33,7 +33,7 @@ jobs:
- name: Set up jdk
uses: actions/setup-java@v3
with:
- java-version: '17'
+ java-version: '17.0.2'
distribution: 'temurin'
- name: Compilation and Installation
run: mvn -B -Dcheckstyle.skip -Dspotbugs.skip=true clean install -Pit
diff --git a/.github/workflows/unit-test-jdk21.yml
b/.github/workflows/unit-test-jdk21.yml
index 0f83cf444..96c73067b 100644
--- a/.github/workflows/unit-test-jdk21.yml
+++ b/.github/workflows/unit-test-jdk21.yml
@@ -33,7 +33,7 @@ jobs:
- name: Set up jdk
uses: actions/setup-java@v3
with:
- java-version: '21'
+ java-version: '21.0.7'
distribution: 'temurin'
- name: Compilation and Installation
run: mvn -B -Dcheckstyle.skip -Dspotbugs.skip=true clean install -Pit
\ No newline at end of file
diff --git
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/DiscoveryEvents.java
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/DiscoveryEvents.java
index e45720f5e..db0d12b1c 100644
---
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/DiscoveryEvents.java
+++
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/DiscoveryEvents.java
@@ -20,8 +20,15 @@ package org.apache.servicecomb.service.center.client;
import java.util.List;
import org.apache.servicecomb.service.center.client.model.MicroserviceInstance;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
public abstract class DiscoveryEvents {
+ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
public static class InstanceChangedEvent extends DiscoveryEvents {
private final String appName;
@@ -52,6 +59,45 @@ public abstract class DiscoveryEvents {
* internal events to ask for a immediate instance pull
*/
public static class PullInstanceEvent extends DiscoveryEvents {
+ private static final Logger LOGGER =
LoggerFactory.getLogger(PullInstanceEvent.class);
+
+ private final String appId;
+
+ private final String serviceName;
+
+ public PullInstanceEvent(String message) {
+ JsonNode messageNode = parseJsonString(message);
+ this.appId = getContextFromNode(messageNode, "appId");
+ this.serviceName = getContextFromNode(messageNode, "serviceName");
+ }
+
+ public String getAppId() {
+ return appId;
+ }
+
+ public String getServiceName() {
+ return serviceName;
+ }
+
+ private JsonNode parseJsonString(String message) {
+ try {
+ return OBJECT_MAPPER.readTree(message);
+ } catch (Exception e) {
+ LOGGER.error("parse message [{}] failed!", message, e);
+ return null;
+ }
+ }
+ private String getContextFromNode(JsonNode messageNode, String itemKey) {
+ if (messageNode == null) {
+ return "";
+ }
+ try {
+ return messageNode.get("key").get(itemKey).asText();
+ } catch (Exception e) {
+ LOGGER.error("get [{}] context from node [{}] failed!", itemKey, e);
+ return "";
+ }
+ }
}
}
diff --git
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterClient.java
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterClient.java
index cbab90217..77d6ddc31 100755
---
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterClient.java
+++
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterClient.java
@@ -226,8 +226,7 @@ public class ServiceCenterClient implements
ServiceCenterOperation {
@Override
public FindMicroserviceInstancesResponse findMicroserviceInstance(String
consumerId, String appId, String serviceName,
- String versionRule,
- String revision) {
+ String versionRule, String revision) {
try {
Map<String, String> headers = new HashMap<>();
headers.put("X-ConsumerId", consumerId);
diff --git
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java
index 28212b20d..0db81ab47 100644
---
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java
+++
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java
@@ -24,8 +24,11 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Random;
+import java.util.Timer;
+import java.util.TimerTask;
import java.util.concurrent.ConcurrentHashMap;
+import org.apache.commons.lang3.StringUtils;
import org.apache.servicecomb.http.client.task.AbstractTask;
import org.apache.servicecomb.http.client.task.Task;
import
org.apache.servicecomb.service.center.client.DiscoveryEvents.InstanceChangedEvent;
@@ -104,6 +107,8 @@ public class ServiceCenterDiscovery extends AbstractTask {
private final Random random = new Random();
+ private Timer timer;
+
public ServiceCenterDiscovery(ServiceCenterClient serviceCenterClient,
EventBus eventBus) {
super("service-center-discovery-task");
this.serviceCenterClient = serviceCenterClient;
@@ -153,7 +158,60 @@ public class ServiceCenterDiscovery extends AbstractTask {
return;
}
pullInstanceTaskOnceInProgress = true;
- startTask(new PullInstanceOnceTask());
+ if (StringUtils.isEmpty(event.getAppId()) ||
StringUtils.isEmpty(event.getServiceName())) {
+ // If the application or service name cannot be resolved, pulled all
services.
+ startTask(new PullInstanceOnceTask());
+ return;
+ }
+ try {
+ String appId = event.getAppId();
+ String serviceName = event.getServiceName();
+ if (!refreshTargetServiceSuccess(appId, serviceName)) {
+ int positive = random.nextInt(300);
+ int sign = random.nextBoolean() ? 1 : -1;
+ long delayTime = 2000L + sign * positive;
+ if (timer == null) {
+ timer = new Timer("event-retry-pull-task");
+ }
+ timer.schedule(new PullTargetServiceTask(appId, serviceName),
delayTime);
+ }
+ } finally {
+ pullInstanceTaskOnceInProgress = false;
+ }
+ }
+
+ class PullTargetServiceTask extends TimerTask {
+ private final String appId;
+
+ private final String serviceName;
+
+ public PullTargetServiceTask(String appId, String serviceName) {
+ this.appId = appId;
+ this.serviceName = serviceName;
+ }
+
+ @Override
+ public void run() {
+ refreshTargetServiceSuccess(appId, serviceName);
+ }
+ }
+
+ private boolean refreshTargetServiceSuccess(String appId, String
serviceName) {
+ SubscriptionKey currentKey = new SubscriptionKey(appId, serviceName);
+ if (instancesCache.get(currentKey) == null) {
+ // No pull during the service startup phase.
+ return true;
+ }
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("pull [{}#{}] instances from service center", appId,
serviceName);
+ }
+ String originRev = instancesCache.get(currentKey).revision;
+ pullInstance(currentKey, instancesCache.get(currentKey), true);
+ String currentRev = instancesCache.get(currentKey).revision;
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("current revision: [{}], origin revision: [{}]",
currentRev, originRev);
+ }
+ return !originRev.equals(currentRev);
}
private List<SubscriptionKey> pullInstance(SubscriptionKey k,
SubscriptionValue v, boolean sendChangedEvent) {
@@ -265,7 +323,7 @@ public class ServiceCenterDiscovery extends AbstractTask {
sb.append(endpoint.length() > 64 ? endpoint.substring(0, 64) :
endpoint);
sb.append("|");
}
- sb.append(instance.getServiceName());
+ sb.append(instance.getStatus());
sb.append("|");
}
sb.append("#");
diff --git
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterOperation.java
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterOperation.java
index 85671fee9..5308c5517 100644
---
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterOperation.java
+++
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterOperation.java
@@ -114,8 +114,7 @@ public interface ServiceCenterOperation {
* @throws OperationException If some problems happened to contact service
center or non http 200 returned.n
*/
FindMicroserviceInstancesResponse findMicroserviceInstance(String
consumerId, String appId, String serviceName,
- String versionRule,
- String revision);
+ String versionRule, String revision);
/**
* Delete a microservice instance
diff --git
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterWatch.java
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterWatch.java
index a8be8b98b..fec165c90 100644
---
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterWatch.java
+++
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterWatch.java
@@ -164,7 +164,7 @@ public class ServiceCenterWatch implements
WebSocketListener {
@Override
public void onMessage(String s) {
LOGGER.info("web socket receive message [{}], start query instance", s);
- this.eventBus.post(new PullInstanceEvent());
+ this.eventBus.post(new PullInstanceEvent(s));
}
@Override