Просмотр исходного кода

feat(基础模块): 增加jvm异常处理

zhouhao 2 лет назад
Родитель
Сommit
509afa40df

+ 12 - 0
jetlinks-components/common-component/src/main/java/org/jetlinks/community/JvmErrorException.java

@@ -0,0 +1,12 @@
+package org.jetlinks.community;
+
+import org.hswebframework.web.exception.I18nSupportException;
+
+public class JvmErrorException extends I18nSupportException {
+
+    public JvmErrorException(Throwable cause) {
+        super("error.jvm_error",cause);
+    }
+
+
+}

+ 17 - 0
jetlinks-components/common-component/src/main/java/org/jetlinks/community/configuration/CommonConfiguration.java

@@ -7,6 +7,7 @@ import org.apache.commons.beanutils.BeanUtilsBean;
 import org.apache.commons.beanutils.Converter;
 import org.hswebframework.ezorm.rdb.mapping.ReactiveRepository;
 import org.jetlinks.community.Interval;
+import org.jetlinks.community.JvmErrorException;
 import org.jetlinks.community.config.ConfigManager;
 import org.jetlinks.community.config.ConfigScopeCustomizer;
 import org.jetlinks.community.config.ConfigScopeProperties;
@@ -33,6 +34,8 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.http.MediaType;
 import org.springframework.util.unit.DataSize;
+import reactor.core.Exceptions;
+import reactor.core.publisher.Hooks;
 
 import javax.annotation.Nonnull;
 import java.time.Duration;
@@ -111,6 +114,20 @@ public class CommonConfiguration {
                 return (T)((Long) CastUtils.castNumber(value).longValue());
             }
         }, Long.class);
+
+        //捕获jvm错误,防止Flux被挂起
+        Hooks.onOperatorError((err, val) -> {
+            if (Exceptions.isJvmFatal(err)) {
+                return new JvmErrorException(err);
+            }
+            return err;
+        });
+        Hooks.onNextError((err, val) -> {
+            if (Exceptions.isJvmFatal(err)) {
+                return new JvmErrorException(err);
+            }
+            return err;
+        });
     }
 
     @Bean

+ 2 - 1
jetlinks-components/common-component/src/main/resources/i18n/common-component/messages_en.properties

@@ -7,4 +7,5 @@ error.base_path_error=base-path error. \
 error.base_path_DNS_resolution_failed=base-path DNS resolution failed\u3002\
   format\uFF1A{http/https}: //{IP address of the server where the front-end is located}:{Front end exposed service port}/api
 error.base_path_validate_request_timeout=base-path validate request timeout\u3002\
-  format\uFF1A{http/https}: //{IP address of the server where the front-end is located}:{Front end exposed service port}/api
+  format\uFF1A{http/https}: //{IP address of the server where the front-end is located}:{Front end exposed service port}/api
+error.jvm_error=System Internal error

+ 2 - 1
jetlinks-components/common-component/src/main/resources/i18n/common-component/messages_zh.properties

@@ -3,4 +3,5 @@ error.data.referenced=\u6570\u636E\u5DF2\u7ECF\u88AB\u5176\u4ED6\u5730\u65B9\u4F
 error.duplicate_key_detail=\u91CD\u590D\u7684\u6570\u636E:{0}
 error.base_path_error=base-path\u9519\u8BEF\u3002 \u6B63\u786E\u683C\u5F0F\uFF1A{http/https}: //{\u524D\u7AEF\u6240\u5728\u670D\u52A1\u5668IP\u5730\u5740}:{\u524D\u7AEF\u66B4\u9732\u7684\u670D\u52A1\u7AEF\u53E3}/api
 error.base_path_DNS_resolution_failed=base-path DNS\u89E3\u6790\u5931\u8D25\u3002\u6B63\u786E\u683C\u5F0F\uFF1A{http/https}: //{\u524D\u7AEF\u6240\u5728\u670D\u52A1\u5668IP\u5730\u5740}:{\u524D\u7AEF\u66B4\u9732\u7684\u670D\u52A1\u7AEF\u53E3}/api
-error.base_path_validate_request_timeout=base-path \u8BF7\u6C42\u9A8C\u8BC1\u8D85\u65F6\u3002\u6B63\u786E\u683C\u5F0F\uFF1A{http/https}: //{\u524D\u7AEF\u6240\u5728\u670D\u52A1\u5668IP\u5730\u5740}:{\u524D\u7AEF\u66B4\u9732\u7684\u670D\u52A1\u7AEF\u53E3}/api
+error.base_path_validate_request_timeout=base-path \u8BF7\u6C42\u9A8C\u8BC1\u8D85\u65F6\u3002\u6B63\u786E\u683C\u5F0F\uFF1A{http/https}: //{\u524D\u7AEF\u6240\u5728\u670D\u52A1\u5668IP\u5730\u5740}:{\u524D\u7AEF\u66B4\u9732\u7684\u670D\u52A1\u7AEF\u53E3}/api
+error.jvm_error=\u7CFB\u7EDF\u5185\u90E8\u9519\u8BEF