wujimin closed pull request #1046: [SCB-1095]Timer task need catch all 
throwable to protected from unexpected error
URL: https://github.com/apache/servicecomb-java-chassis/pull/1046
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git 
a/dynamic-config/config-apollo/src/main/java/org/apache/servicecomb/config/client/ApolloClient.java
 
b/dynamic-config/config-apollo/src/main/java/org/apache/servicecomb/config/client/ApolloClient.java
index 54a23fa5c..e2fa9478b 100644
--- 
a/dynamic-config/config-apollo/src/main/java/org/apache/servicecomb/config/client/ApolloClient.java
+++ 
b/dynamic-config/config-apollo/src/main/java/org/apache/servicecomb/config/client/ApolloClient.java
@@ -93,8 +93,7 @@ public void refreshApolloConfig() {
     public void run() {
       try {
         refreshConfig();
-      } catch (Exception e) {
-
+      } catch (Throwable e) {
         LOGGER.error("client refresh thread exception ", e);
       }
     }
diff --git 
a/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ConfigCenterClient.java
 
b/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ConfigCenterClient.java
index aabf1ef75..56cb27e8f 100644
--- 
a/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ConfigCenterClient.java
+++ 
b/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ConfigCenterClient.java
@@ -252,7 +252,7 @@ public void run(boolean wait) {
           refreshConfig(configCenter, wait);
           doWatch(configCenter);
         }
-      } catch (Exception e) {
+      } catch (Throwable e) {
         LOGGER.error("client refresh thread exception", e);
       }
     }
diff --git 
a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/event/SimpleSubscriber.java
 
b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/event/SimpleSubscriber.java
index e83a6bd21..ea44dfebd 100644
--- 
a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/event/SimpleSubscriber.java
+++ 
b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/event/SimpleSubscriber.java
@@ -70,7 +70,11 @@ public Method getMethod() {
   }
 
   public void dispatchEvent(Object event) {
-    dispatcher.accept(event);
+    try {
+      dispatcher.accept(event);
+    } catch (Throwable e) {
+      LOGGER.error("event process should not throw error. ", e);
+    }
   }
 
   private void syncDispatch(Object event) {
diff --git 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java
 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java
index d2647f082..1ce656eb4 100644
--- 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java
+++ 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java
@@ -25,11 +25,15 @@
 
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
 import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.eventbus.EventBus;
 import com.google.common.util.concurrent.ThreadFactoryBuilder;
 
 public class MetricsBootstrap {
+  private static final Logger LOGGER = 
LoggerFactory.getLogger(MetricsBootstrap.class);
+
   private GlobalRegistry globalRegistry;
 
   private EventBus eventBus;
@@ -73,8 +77,12 @@ protected void startPoll() {
   }
 
   public synchronized void pollMeters() {
-    long secondInterval = 
TimeUnit.MILLISECONDS.toSeconds(config.getMsPollInterval());
-    PolledEvent polledEvent = globalRegistry.poll(secondInterval);
-    eventBus.post(polledEvent);
+    try {
+      long secondInterval = 
TimeUnit.MILLISECONDS.toSeconds(config.getMsPollInterval());
+      PolledEvent polledEvent = globalRegistry.poll(secondInterval);
+      eventBus.post(polledEvent);
+    } catch (Throwable e) {
+      LOGGER.error("poll meters error. ", e);
+    }
   }
 }
diff --git 
a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/ServiceRegistryClientImpl.java
 
b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/ServiceRegistryClientImpl.java
index e73033a1c..12e3b8c30 100644
--- 
a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/ServiceRegistryClientImpl.java
+++ 
b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/ServiceRegistryClientImpl.java
@@ -125,6 +125,10 @@ private void retry(RequestContext requestContext, 
Handler<RestResponse> response
         return;
       }
       holder.setStatusCode(response.statusCode());
+      response.exceptionHandler(e -> {
+        LOGGER.error("error in processing response.", e);
+        countDownLatch.countDown();
+      });
       response.bodyHandler(
           bodyBuffer -> {
             if (cls.getName().equals(HttpClientResponse.class.getName())) {
@@ -184,7 +188,10 @@ private void retry(RequestContext requestContext, 
Handler<RestResponse> response
 
         return;
       }
-
+      response.exceptionHandler(e -> {
+        LOGGER.error("error in processing response.", e);
+        countDownLatch.countDown();
+      });
       response.bodyHandler(bodyBuffer -> {
         ResponseWrapper responseWrapper = new ResponseWrapper();
         responseWrapper.response = response;
@@ -209,6 +216,10 @@ private void retry(RequestContext requestContext, 
Handler<RestResponse> response
         }
         return;
       }
+      response.exceptionHandler(e -> {
+        LOGGER.warn("failed to findInstances.", e);
+        countDownLatch.countDown();
+      });
       response.bodyHandler(
           bodyBuffer -> {
             try {
diff --git 
a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/InstanceCacheChecker.java
 
b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/InstanceCacheChecker.java
index ec27cb05e..a71c7d085 100644
--- 
a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/InstanceCacheChecker.java
+++ 
b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/InstanceCacheChecker.java
@@ -102,6 +102,8 @@ protected InstanceCacheResult check(MicroserviceVersions 
microserviceVersions) {
       instanceCacheResult.setDetail(String.format(
           "revision is different, will be synchronized in next pull. local 
revision=%s, remote revision=%s",
           microserviceVersions.getRevision(), 
microserviceInstances.getRevision()));
+      // better to change revision and more likely to find the correct 
instances in next pull.
+      microserviceVersions.setRevision(null);
       return instanceCacheResult;
     }
 
diff --git 
a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/RemoteServiceRegistry.java
 
b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/RemoteServiceRegistry.java
index 1dc0be820..eed2d08e1 100644
--- 
a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/RemoteServiceRegistry.java
+++ 
b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/RemoteServiceRegistry.java
@@ -52,9 +52,21 @@ public RemoteServiceRegistry(EventBus eventBus, 
ServiceRegistryConfig serviceReg
   @Override
   public void init() {
     super.init();
-    taskPool = new ScheduledThreadPoolExecutor(2,
-        task -> new Thread(task, "Service Center Task"),
-        (task, executor) -> LOGGER.warn("Too many pending tasks, reject " + 
task.getClass().getName())
+    taskPool = new ScheduledThreadPoolExecutor(3,
+        task -> {
+          return new Thread(task) {
+            @Override
+            public void run() {
+              try {
+                setName("Service Center Task [" + task.toString() + "[" + 
this.getId() + "]]");
+                super.run();
+              } catch (Throwable e) {
+                LOGGER.error("task {} execute error.", getName(), e);
+              }
+            }
+          };
+        },
+        (task, executor) -> LOGGER.warn("Too many pending tasks, reject " + 
task.toString())
     );
   }
 


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to