diff --git a/common/src/main/java/org/dromara/dynamictp/common/parser/json/AbstractJsonParser.java b/common/src/main/java/org/dromara/dynamictp/common/parser/json/AbstractJsonParser.java index a8211bd8b..2e6d52f29 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/parser/json/AbstractJsonParser.java +++ b/common/src/main/java/org/dromara/dynamictp/common/parser/json/AbstractJsonParser.java @@ -17,21 +17,28 @@ package org.dromara.dynamictp.common.parser.json; +import lombok.extern.slf4j.Slf4j; + /** * * @author topsuder * @since 1.1.3 */ +@Slf4j public abstract class AbstractJsonParser implements JsonParser { @Override public boolean supports() { - try { - Class.forName(getMapperClassName()); - return true; - } catch (ClassNotFoundException e) { - return false; + String[] mapperClassNames = getMapperClassNames(); + for (String mapperClassName : mapperClassNames) { + try { + Class.forName(mapperClassName); + } catch (ClassNotFoundException e) { + log.warn("the current parser is {}, Can not find class: {}", this.getClass().getSimpleName(), mapperClassName); + return false; + } } + return true; } /** @@ -39,5 +46,5 @@ public boolean supports() { * * @return mapper class name */ - protected abstract String getMapperClassName(); + protected abstract String[] getMapperClassNames(); } diff --git a/common/src/main/java/org/dromara/dynamictp/common/parser/json/FastJsonParser.java b/common/src/main/java/org/dromara/dynamictp/common/parser/json/FastJsonParser.java index fb0d44b86..082b166f6 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/parser/json/FastJsonParser.java +++ b/common/src/main/java/org/dromara/dynamictp/common/parser/json/FastJsonParser.java @@ -42,7 +42,7 @@ public String toJson(Object obj) { } @Override - protected String getMapperClassName() { - return PACKAGE_NAME; + protected String[] getMapperClassNames() { + return new String[]{PACKAGE_NAME}; } } diff --git a/common/src/main/java/org/dromara/dynamictp/common/parser/json/GsonParser.java b/common/src/main/java/org/dromara/dynamictp/common/parser/json/GsonParser.java index ed535621f..9e429c0db 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/parser/json/GsonParser.java +++ b/common/src/main/java/org/dromara/dynamictp/common/parser/json/GsonParser.java @@ -93,7 +93,7 @@ public LocalDateTime read(JsonReader in) throws IOException { } @Override - protected String getMapperClassName() { - return PACKAGE_NAME; + protected String[] getMapperClassNames() { + return new String[]{PACKAGE_NAME}; } } diff --git a/common/src/main/java/org/dromara/dynamictp/common/parser/json/JacksonCreator.java b/common/src/main/java/org/dromara/dynamictp/common/parser/json/JacksonCreator.java new file mode 100644 index 000000000..8d3fdc8f5 --- /dev/null +++ b/common/src/main/java/org/dromara/dynamictp/common/parser/json/JacksonCreator.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.dynamictp.common.parser.json; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.json.JsonMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; + +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +/** + * @author KamTo Hung + */ +public class JacksonCreator { + + private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; + + protected static ObjectMapper createMapper() { + JavaTimeModule javaTimeModule = new JavaTimeModule(); + javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT))); + javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATE_FORMAT))); + return JsonMapper.builder() + .configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true) + // 反序列化时,遇到未知属性会不会报错 true - 遇到没有的属性就报错 false - 没有的属性不会管,不会报错 + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + // 如果是空对象的时候,不抛异常 + .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false) + // 序列化的时候序列对象的那些属性 + .serializationInclusion(JsonInclude.Include.NON_EMPTY) + .addModules(javaTimeModule) + .addModules(new JavaTimeModule()) + // 修改序列化后日期格式 + .defaultDateFormat(new SimpleDateFormat(DATE_FORMAT)) + .build(); + } + +} diff --git a/common/src/main/java/org/dromara/dynamictp/common/parser/json/JacksonParser.java b/common/src/main/java/org/dromara/dynamictp/common/parser/json/JacksonParser.java index f6bebed65..90ec08845 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/parser/json/JacksonParser.java +++ b/common/src/main/java/org/dromara/dynamictp/common/parser/json/JacksonParser.java @@ -17,34 +17,24 @@ package org.dromara.dynamictp.common.parser.json; -import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.json.JsonMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import lombok.extern.slf4j.Slf4j; import java.io.IOException; import java.lang.reflect.Type; -import java.text.SimpleDateFormat; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; /** - * * @author topsuder * @since 1.1.3 */ @Slf4j public class JacksonParser extends AbstractJsonParser { - private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; private static final String PACKAGE_NAME = "com.fasterxml.jackson.databind.ObjectMapper"; + + private static final String JAVA_TIME_MODULE_CLASS_NAME = "com.fasterxml.jackson.datatype.jsr310.JavaTimeModule"; + private volatile ObjectMapper mapper; @Override @@ -79,27 +69,11 @@ private ObjectMapper getMapper() { } protected ObjectMapper createMapper() { - // 只提供最简单的方案 - JavaTimeModule javaTimeModule = new JavaTimeModule(); - javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); - javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); - return JsonMapper.builder() - .configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true) - // 反序列化时,遇到未知属性会不会报错 true - 遇到没有的属性就报错 false - 没有的属性不会管,不会报错 - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - // 如果是空对象的时候,不抛异常 - .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false) - // 序列化的时候序列对象的那些属性 - .serializationInclusion(JsonInclude.Include.NON_EMPTY) - .addModules(javaTimeModule) - .addModules(new JavaTimeModule()) - // 修改序列化后日期格式 - .defaultDateFormat(new SimpleDateFormat(DATE_FORMAT)) - .build(); + return JacksonCreator.createMapper(); } @Override - protected String getMapperClassName() { - return PACKAGE_NAME; + protected String[] getMapperClassNames() { + return new String[]{PACKAGE_NAME, JAVA_TIME_MODULE_CLASS_NAME}; } } diff --git a/common/src/main/java/org/dromara/dynamictp/common/util/JsonUtil.java b/common/src/main/java/org/dromara/dynamictp/common/util/JsonUtil.java index eabbdc98e..0ab5b47a8 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/util/JsonUtil.java +++ b/common/src/main/java/org/dromara/dynamictp/common/util/JsonUtil.java @@ -46,9 +46,11 @@ private static JsonParser createJsonParser() { try { JsonParser jsonParser = iterator.next(); if (jsonParser.supports()) { + log.info("Using JSON parser: {}", jsonParser.getClass().getName()); return jsonParser; } - } catch (Throwable ignored) { + } catch (Throwable e) { + log.error("Failed to load JSON parser", e); } } throw new IllegalStateException("No JSON parser found"); diff --git a/test/test-core/src/test/resources/dynamic-tp-nacos-demo-dtp-dev.yml b/test/test-core/src/test/resources/dynamic-tp-nacos-demo-dtp-dev.yml index 5358276cd..0b47afd99 100644 --- a/test/test-core/src/test/resources/dynamic-tp-nacos-demo-dtp-dev.yml +++ b/test/test-core/src/test/resources/dynamic-tp-nacos-demo-dtp-dev.yml @@ -123,7 +123,7 @@ dynamictp: preStartAllCoreThreads: false # 是否预热所有核心线程,默认false runTimeout: 200 # 任务执行超时阈值,目前只做告警用,单位(ms) queueTimeout: 100 # 任务在队列等待超时阈值,目前只做告警用,单位(ms) - taskWrapperNames: ["ttl"] # 任务包装器名称,集成TaskWrapper接口 + taskWrapperNames: ["ttl"] # 任务包装器名称,集成TaskWrapper接口 notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警、拒绝报警、任务超时报警) - type: capacity # 报警项类型,查看源码 NotifyTypeEnum枚举类 enabled: true