-
org.springframework.bootspring-boot-starter-testtest
-
cn.hippo4j
- hippo4j-core
+ hippo4j-message
+ ${revision}
-
com.alibabatransmittable-thread-local
+ ${transmittable-thread-local.version}
-
org.openjdk.jmhjmh-core1.23test
-
org.openjdk.jmhjmh-generator-annprocess1.23test
-
diff --git a/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/handler/TaskTraceBuilderHandler.java b/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/handler/TaskTraceBuilderHandler.java
index e557fe8f..5098a8f2 100644
--- a/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/handler/TaskTraceBuilderHandler.java
+++ b/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/handler/TaskTraceBuilderHandler.java
@@ -34,7 +34,7 @@ public final class TaskTraceBuilderHandler implements TaskDecorator {
String executeTimeoutTrace = MDC.get(EXECUTE_TIMEOUT_TRACE);
Runnable taskRun = () -> {
if (StringUtil.isNotBlank(executeTimeoutTrace)) {
- ExecutorTraceContextUtil.putExecuteTimeoutTrace(executeTimeoutTrace);
+ ExecutorTraceContextUtil.putTimeoutTrace(executeTimeoutTrace);
}
runnable.run();
// There is no need to clean up here, and it will be cleaned up after the thread task is executed.
diff --git a/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/inittest/RegisterDynamicThreadPoolTest.java b/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/inittest/RegisterDynamicThreadPoolTest.java
index d081f092..5699a205 100644
--- a/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/inittest/RegisterDynamicThreadPoolTest.java
+++ b/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/inittest/RegisterDynamicThreadPoolTest.java
@@ -17,14 +17,14 @@
package cn.hippo4j.example.core.inittest;
+import cn.hippo4j.common.executor.support.BlockingQueueTypeEnum;
+import cn.hippo4j.common.executor.support.RejectedPolicyTypeEnum;
import cn.hippo4j.common.model.register.DynamicThreadPoolRegisterParameter;
import cn.hippo4j.common.model.register.DynamicThreadPoolRegisterWrapper;
import cn.hippo4j.common.model.register.notify.DynamicThreadPoolRegisterCoreNotifyParameter;
import cn.hippo4j.common.model.register.notify.DynamicThreadPoolRegisterServerNotifyParameter;
import cn.hippo4j.common.toolkit.JSONUtil;
import cn.hippo4j.core.executor.manage.GlobalThreadPoolManage;
-import cn.hippo4j.common.executor.support.BlockingQueueTypeEnum;
-import cn.hippo4j.common.executor.support.RejectedPolicyTypeEnum;
import cn.hippo4j.message.enums.NotifyPlatformEnum;
import lombok.extern.slf4j.Slf4j;
@@ -68,9 +68,9 @@ public class RegisterDynamicThreadPoolTest {
DynamicThreadPoolRegisterWrapper registerWrapper = DynamicThreadPoolRegisterWrapper.builder()
.updateIfExists(true)
.notifyUpdateIfExists(true)
- .dynamicThreadPoolRegisterParameter(parameterInfo)
- .dynamicThreadPoolRegisterCoreNotifyParameter(coreNotifyParameter)
- .dynamicThreadPoolRegisterServerNotifyParameter(serverNotifyParameter)
+ .parameter(parameterInfo)
+ .configNotify(coreNotifyParameter)
+ .serverNotify(serverNotifyParameter)
.build();
ThreadPoolExecutor dynamicThreadPool = GlobalThreadPoolManage.dynamicRegister(registerWrapper);
log.info("Dynamic registration thread pool parameter details: {}", JSONUtil.toJSONString(dynamicThreadPool));
diff --git a/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/inittest/RunStateHandlerTest.java b/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/inittest/RunStateHandlerTest.java
index 00c3ed2f..dc5747fb 100644
--- a/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/inittest/RunStateHandlerTest.java
+++ b/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/inittest/RunStateHandlerTest.java
@@ -18,6 +18,7 @@
package cn.hippo4j.example.core.inittest;
import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@@ -28,6 +29,8 @@ import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
+import static cn.hippo4j.common.constant.Constants.EXECUTE_TIMEOUT_TRACE;
+
/**
* Run state handler test.
*/
@@ -44,7 +47,6 @@ public class RunStateHandlerTest {
/*
* @Resource private ThreadPoolTaskExecutor testSpringThreadPoolTaskExecutor;
*/
-
private final ThreadPoolExecutor runStateHandlerTestExecutor = new ThreadPoolExecutor(
4,
4,
@@ -78,7 +80,7 @@ public class RunStateHandlerTest {
/**
* When the execution of the thread pool task times out, the Trace flag is put into the MDC, and it is printed out when an alarm occurs.
*/
- // MDC.put(EXECUTE_TIMEOUT_TRACE, "39948722194639841.251.16612352194691531");
+ MDC.put(EXECUTE_TIMEOUT_TRACE, "39948722194639841.251.16612352194691531");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
diff --git a/hippo4j-example/hippo4j-spring-boot-starter-adapter-kafka-example/pom.xml b/hippo4j-example/hippo4j-spring-boot-starter-adapter-kafka-example/pom.xml
deleted file mode 100644
index 40bcca10..00000000
--- a/hippo4j-example/hippo4j-spring-boot-starter-adapter-kafka-example/pom.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
- 4.0.0
-
- cn.hippo4j
- hippo4j-example
- ${revision}
-
- hippo4j-spring-boot-starter-adapter-kafka-example
-
-
-
- org.springframework.boot
- spring-boot-starter
-
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
-
- org.springframework.boot
- spring-boot-starter-json
-
-
-
- org.projectlombok
- lombok
-
-
-
- cn.hippo4j
- hippo4j-spring-boot-starter-adapter-kafka
- ${project.version}
-
-
-
- cn.hippo4j
- hippo4j-spring-boot-starter
- ${project.version}
-
-
-
- cn.hippo4j
- hippo4j-example-core
- ${revision}
-
-
-
- org.springframework.kafka
- spring-kafka
-
-
-
diff --git a/hippo4j-example/hippo4j-spring-boot-starter-adapter-kafka-example/src/main/java/cn/hippo4j/springboot/starter/adapter/kafka/example/consumer/KafkaMessageConsumer.java b/hippo4j-example/hippo4j-spring-boot-starter-adapter-kafka-example/src/main/java/cn/hippo4j/springboot/starter/adapter/kafka/example/consumer/KafkaMessageConsumer.java
deleted file mode 100644
index 43087cc9..00000000
--- a/hippo4j-example/hippo4j-spring-boot-starter-adapter-kafka-example/src/main/java/cn/hippo4j/springboot/starter/adapter/kafka/example/consumer/KafkaMessageConsumer.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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 cn.hippo4j.springboot.starter.adapter.kafka.example.consumer;
-
-import lombok.extern.slf4j.Slf4j;
-import org.apache.kafka.clients.consumer.ConsumerRecord;
-import org.springframework.kafka.annotation.KafkaListener;
-import org.springframework.kafka.support.Acknowledgment;
-import org.springframework.kafka.support.KafkaHeaders;
-import org.springframework.messaging.handler.annotation.Header;
-import org.springframework.stereotype.Component;
-
-import java.util.Optional;
-
-/**
- * Kafka message consumer.
- */
-@Slf4j
-@Component
-public class KafkaMessageConsumer {
-
- @KafkaListener(topics = "kafka_message_hippo4j", groupId = "hippo4j")
- public void onMessage(ConsumerRecord, ?> record, Acknowledgment ack, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {
- Optional message = Optional.ofNullable(record.value());
- message.ifPresent(each -> log.info(each.toString()));
- ack.acknowledge();
- }
-}
diff --git a/hippo4j-example/hippo4j-spring-boot-starter-adapter-kafka-example/src/main/java/cn/hippo4j/springboot/starter/adapter/kafka/example/produce/KafkaMessageProduce.java b/hippo4j-example/hippo4j-spring-boot-starter-adapter-kafka-example/src/main/java/cn/hippo4j/springboot/starter/adapter/kafka/example/produce/KafkaMessageProduce.java
deleted file mode 100644
index 9cfbddbd..00000000
--- a/hippo4j-example/hippo4j-spring-boot-starter-adapter-kafka-example/src/main/java/cn/hippo4j/springboot/starter/adapter/kafka/example/produce/KafkaMessageProduce.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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 cn.hippo4j.springboot.starter.adapter.kafka.example.produce;
-
-import cn.hippo4j.common.toolkit.IdUtil;
-import cn.hippo4j.common.toolkit.JSONUtil;
-import cn.hippo4j.example.core.dto.SendMessageDTO;
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.kafka.core.KafkaTemplate;
-import org.springframework.stereotype.Component;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * Kafka message produce.
- */
-@Slf4j
-@Component
-@RestController
-@AllArgsConstructor
-public class KafkaMessageProduce {
-
- private final KafkaTemplate kafkaTemplate;
-
- private final String TOPIC = "kafka_message_hippo4j";
-
- @GetMapping("/message/send")
- public String sendMessage(Integer count) {
- for (int i = 0; i < count; i++) {
- String keys = IdUtil.randomUUID();
- SendMessageDTO payload = SendMessageDTO.builder()
- .receiver("156011xxx91")
- .uid(keys)
- .build();
- kafkaTemplate.send(TOPIC, JSONUtil.toJSONString(payload));
- }
- return "success";
- }
-}
diff --git a/hippo4j-example/hippo4j-spring-boot-starter-adapter-kafka-example/src/main/resources/application.properties b/hippo4j-example/hippo4j-spring-boot-starter-adapter-kafka-example/src/main/resources/application.properties
deleted file mode 100644
index fe298e76..00000000
--- a/hippo4j-example/hippo4j-spring-boot-starter-adapter-kafka-example/src/main/resources/application.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-server.port=8092
-
-spring.profiles.active=dev
-spring.dynamic.thread-pool.server-addr=http://localhost:6691
-spring.dynamic.thread-pool.namespace=prescription
-spring.dynamic.thread-pool.item-id=dynamic-threadpool-example
-spring.dynamic.thread-pool.username=admin
-spring.dynamic.thread-pool.password=123456
-
-spring.kafka.bootstrap-servers=127.0.0.1:9092
-spring.kafka.producer.retries=0
-spring.kafka.producer.batch-size=16384
-spring.kafka.producer.buffer-memory=33554432
-spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
-spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
-spring.kafka.producer.acks=1
-spring.kafka.consumer.auto-offset-reset=latest
-spring.kafka.consumer.enable-auto-commit=false
-spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
-spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
-spring.kafka.listener.concurrency=2
-spring.kafka.listener.ack-mode=manual_immediate
-spring.kafka.listener.missing-topics-fatal=false
diff --git a/hippo4j-example/hippo4j-spring-boot-starter-adapter-rabbitmq-example/pom.xml b/hippo4j-example/hippo4j-spring-boot-starter-adapter-rabbitmq-example/pom.xml
index ab8e038d..d94e8b62 100644
--- a/hippo4j-example/hippo4j-spring-boot-starter-adapter-rabbitmq-example/pom.xml
+++ b/hippo4j-example/hippo4j-spring-boot-starter-adapter-rabbitmq-example/pom.xml
@@ -18,40 +18,29 @@
org.springframework.bootspring-boot-starter
-
org.springframework.bootspring-boot-starter-web
-
-
- org.springframework.boot
- spring-boot-starter-json
-
-
org.projectlomboklombok
-
cn.hippo4jhippo4j-spring-boot-starter-adapter-rabbitmq${project.version}
-
cn.hippo4jhippo4j-spring-boot-starter${project.version}
-
cn.hippo4jhippo4j-example-core${revision}
-
org.springframework.bootspring-boot-starter-amqp
diff --git a/hippo4j-example/hippo4j-spring-boot-starter-adapter-rocketmq-example/pom.xml b/hippo4j-example/hippo4j-spring-boot-starter-adapter-rocketmq-example/pom.xml
index cbabedf9..ba28fe22 100644
--- a/hippo4j-example/hippo4j-spring-boot-starter-adapter-rocketmq-example/pom.xml
+++ b/hippo4j-example/hippo4j-spring-boot-starter-adapter-rocketmq-example/pom.xml
@@ -18,38 +18,33 @@
org.springframework.bootspring-boot-starter
-
org.springframework.bootspring-boot-starter-web
-
-
- org.springframework.boot
- spring-boot-starter-json
-
-
org.projectlomboklombok
-
cn.hippo4jhippo4j-spring-boot-starter-adapter-rocketmq${project.version}
-
cn.hippo4jhippo4j-spring-boot-starter${project.version}
-
cn.hippo4jhippo4j-example-core${revision}
+
+ org.apache.rocketmq
+ rocketmq-spring-boot-starter
+ ${rocketmq.version}
+
diff --git a/hippo4j-example/hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rabbitmq-example/pom.xml b/hippo4j-example/hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rabbitmq-example/pom.xml
index 389906cb..17c7ad72 100644
--- a/hippo4j-example/hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rabbitmq-example/pom.xml
+++ b/hippo4j-example/hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rabbitmq-example/pom.xml
@@ -18,39 +18,34 @@
org.springframework.bootspring-boot-starter
-
org.springframework.bootspring-boot-starter-web
-
-
- org.springframework.boot
- spring-boot-starter-json
-
-
org.projectlomboklombok
-
cn.hippo4jhippo4j-spring-boot-starter-adapter-spring-cloud-stream-rabbitmq${project.version}
-
cn.hippo4jhippo4j-spring-boot-starter${project.version}
-
cn.hippo4jhippo4j-example-core${revision}
+
+ org.springframework.cloud
+ spring-cloud-starter-stream-rabbit
+ ${spring-cloud-starter-stream-rabbitmq.version}
+
diff --git a/hippo4j-example/hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rocketmq-example/pom.xml b/hippo4j-example/hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rocketmq-example/pom.xml
index 37faf900..0dc3f119 100644
--- a/hippo4j-example/hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rocketmq-example/pom.xml
+++ b/hippo4j-example/hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rocketmq-example/pom.xml
@@ -19,40 +19,29 @@
org.springframework.bootspring-boot-starter
-
org.springframework.bootspring-boot-starter-web
-
com.alibaba.cloudspring-cloud-starter-stream-rocketmq${spring-cloud-starter-stream-rocketmq.version}
-
-
- org.springframework.boot
- spring-boot-starter-json
-
-
org.projectlomboklombok
-
cn.hippo4jhippo4j-spring-boot-starter-adapter-spring-cloud-stream-rocketmq${project.version}
-
cn.hippo4jhippo4j-spring-boot-starter${project.version}
-
cn.hippo4jhippo4j-example-core
diff --git a/hippo4j-example/pom.xml b/hippo4j-example/pom.xml
index 8672119d..80999ea3 100644
--- a/hippo4j-example/pom.xml
+++ b/hippo4j-example/pom.xml
@@ -21,7 +21,6 @@
hippo4j-config-nacos-spring-boot-starter-examplehippo4j-config-apollo-spring-boot-starter-examplehippo4j-config-zookeeper-spring-boot-starter-example
- hippo4j-spring-boot-starter-adapter-kafka-examplehippo4j-spring-boot-starter-adapter-rabbitmq-examplehippo4j-spring-boot-starter-adapter-spring-cloud-stream-rabbitmq-examplehippo4j-spring-boot-starter-adapter-spring-cloud-stream-rocketmq-example
diff --git a/hippo4j-message/pom.xml b/hippo4j-message/pom.xml
index b32e2992..09fed8e6 100644
--- a/hippo4j-message/pom.xml
+++ b/hippo4j-message/pom.xml
@@ -12,17 +12,13 @@
cn.hippo4j
- hippo4j-common
+ hippo4j-core${revision}
-
- org.projectlombok
- lombok
- com.aliyunalibaba-dingtalk-service-sdk
- true
+ ${dingtalk-sdk.version}
diff --git a/hippo4j-message/src/main/java/cn/hippo4j/message/dto/AlarmControlDTO.java b/hippo4j-message/src/main/java/cn/hippo4j/message/dto/AlarmControlDTO.java
index 11c5128f..73cb7314 100644
--- a/hippo4j-message/src/main/java/cn/hippo4j/message/dto/AlarmControlDTO.java
+++ b/hippo4j-message/src/main/java/cn/hippo4j/message/dto/AlarmControlDTO.java
@@ -18,7 +18,9 @@
package cn.hippo4j.message.dto;
import cn.hippo4j.message.enums.NotifyTypeEnum;
-import lombok.*;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
/**
* Alarm control DTO.
diff --git a/hippo4j-message/src/main/java/cn/hippo4j/message/platform/WeChatSendMessageHandler.java b/hippo4j-message/src/main/java/cn/hippo4j/message/platform/WeChatSendMessageHandler.java
index 68dcbed5..b4fb42bf 100644
--- a/hippo4j-message/src/main/java/cn/hippo4j/message/platform/WeChatSendMessageHandler.java
+++ b/hippo4j-message/src/main/java/cn/hippo4j/message/platform/WeChatSendMessageHandler.java
@@ -70,6 +70,9 @@ public class WeChatSendMessageHandler extends AbstractRobotSendMessageHandler {
}
}
+ /**
+ * WeChat
+ */
@Data
@Accessors(chain = true)
public static class WeChatReqDTO {
@@ -79,6 +82,9 @@ public class WeChatSendMessageHandler extends AbstractRobotSendMessageHandler {
private Markdown markdown;
}
+ /**
+ * Markdown
+ */
@Data
public static class Markdown {
diff --git a/hippo4j-message/src/main/java/cn/hippo4j/message/platform/base/AbstractRobotSendMessageHandler.java b/hippo4j-message/src/main/java/cn/hippo4j/message/platform/base/AbstractRobotSendMessageHandler.java
index 209c2db9..f8acca94 100644
--- a/hippo4j-message/src/main/java/cn/hippo4j/message/platform/base/AbstractRobotSendMessageHandler.java
+++ b/hippo4j-message/src/main/java/cn/hippo4j/message/platform/base/AbstractRobotSendMessageHandler.java
@@ -72,7 +72,7 @@ public abstract class AbstractRobotSendMessageHandler implements SendMessageHand
} else {
replaceTxt = "";
}
- alarmContentTxt = StringUtil.replace(alarmContentTxt, "${timout-content}", replaceTxt);
+ alarmContentTxt = StringUtil.replace(alarmContentTxt, "${timeout-content}", replaceTxt);
String text = String.format(
alarmContentTxt,
alarmNotifyRequest.getActive(),
diff --git a/hippo4j-message/src/main/java/cn/hippo4j/message/platform/constant/DingAlarmConstants.java b/hippo4j-message/src/main/java/cn/hippo4j/message/platform/constant/DingAlarmConstants.java
index f8505403..f4bb2285 100644
--- a/hippo4j-message/src/main/java/cn/hippo4j/message/platform/constant/DingAlarmConstants.java
+++ b/hippo4j-message/src/main/java/cn/hippo4j/message/platform/constant/DingAlarmConstants.java
@@ -46,8 +46,8 @@ public class DingAlarmConstants {
* Replace task timeout template
*/
public static final String DING_ALARM_TIMEOUT_REPLACE_TXT =
- "任务执行时间:%d / ms \n\n " +
- "超时时间:%d / ms \n\n " +
- DING_ALARM_TIMEOUT_TRACE_REPLACE_TXT +
- " --- \n\n ";
+ "任务执行时间:%d / ms \n\n "
+ + "超时时间:%d / ms \n\n "
+ + DING_ALARM_TIMEOUT_TRACE_REPLACE_TXT
+ + " --- \n\n ";
}
diff --git a/hippo4j-message/src/main/java/cn/hippo4j/message/platform/constant/WeChatAlarmConstants.java b/hippo4j-message/src/main/java/cn/hippo4j/message/platform/constant/WeChatAlarmConstants.java
index 8d4f56f8..8b6001fc 100644
--- a/hippo4j-message/src/main/java/cn/hippo4j/message/platform/constant/WeChatAlarmConstants.java
+++ b/hippo4j-message/src/main/java/cn/hippo4j/message/platform/constant/WeChatAlarmConstants.java
@@ -36,7 +36,7 @@ public class WeChatAlarmConstants {
* Replace task timeout template
*/
public static final String WE_CHAT_ALARM_TIMOUT_REPLACE_TXT =
- "\n> 任务执行时间:%s / ms \n" +
- "> 超时时间:%s / ms " +
- WE_CHAT_ALARM_TIMOUT_TRACE_REPLACE_TXT;
+ "\n> 任务执行时间:%s / ms \n"
+ + "> 超时时间:%s / ms "
+ + WE_CHAT_ALARM_TIMOUT_TRACE_REPLACE_TXT;
}
diff --git a/hippo4j-message/src/main/java/cn/hippo4j/message/request/base/BaseNotifyRequest.java b/hippo4j-message/src/main/java/cn/hippo4j/message/request/base/BaseNotifyRequest.java
index 5c96e994..5db9a63c 100644
--- a/hippo4j-message/src/main/java/cn/hippo4j/message/request/base/BaseNotifyRequest.java
+++ b/hippo4j-message/src/main/java/cn/hippo4j/message/request/base/BaseNotifyRequest.java
@@ -17,6 +17,7 @@
package cn.hippo4j.message.request.base;
+import cn.hippo4j.common.api.NotifyRequest;
import lombok.Data;
/**
diff --git a/hippo4j-message/src/main/java/cn/hippo4j/message/service/AlarmControlHandler.java b/hippo4j-message/src/main/java/cn/hippo4j/message/service/AlarmControlHandler.java
index ea86e0f2..4d94b6bc 100644
--- a/hippo4j-message/src/main/java/cn/hippo4j/message/service/AlarmControlHandler.java
+++ b/hippo4j-message/src/main/java/cn/hippo4j/message/service/AlarmControlHandler.java
@@ -18,7 +18,6 @@
package cn.hippo4j.message.service;
import cn.hippo4j.common.constant.Constants;
-import cn.hippo4j.common.toolkit.IdUtil;
import cn.hippo4j.common.toolkit.StringUtil;
import cn.hippo4j.message.dto.AlarmControlDTO;
import com.github.benmanes.caffeine.cache.Cache;
@@ -58,8 +57,7 @@ public class AlarmControlHandler {
try {
pkId = cache.getIfPresent(alarmControl.getTypeEnum().name());
if (StringUtil.isBlank(pkId)) {
- // Val meaningless.
- cache.put(alarmControl.getTypeEnum().name(), IdUtil.simpleUUID());
+ cache.put(alarmControl.getTypeEnum().name(), "-");
return true;
}
} finally {
diff --git a/hippo4j-core/src/main/java/cn/hippo4j/core/executor/ThreadPoolNotifyAlarmHandler.java b/hippo4j-message/src/main/java/cn/hippo4j/message/service/DefaultThreadPoolCheckAlarmHandler.java
similarity index 87%
rename from hippo4j-core/src/main/java/cn/hippo4j/core/executor/ThreadPoolNotifyAlarmHandler.java
rename to hippo4j-message/src/main/java/cn/hippo4j/message/service/DefaultThreadPoolCheckAlarmHandler.java
index 62c8bf53..de770758 100644
--- a/hippo4j-core/src/main/java/cn/hippo4j/core/executor/ThreadPoolNotifyAlarmHandler.java
+++ b/hippo4j-message/src/main/java/cn/hippo4j/message/service/DefaultThreadPoolCheckAlarmHandler.java
@@ -15,24 +15,22 @@
* limitations under the License.
*/
-package cn.hippo4j.core.executor;
+package cn.hippo4j.message.service;
+import cn.hippo4j.common.api.ThreadPoolCheckAlarm;
import cn.hippo4j.common.toolkit.CalculateUtil;
import cn.hippo4j.common.toolkit.StringUtil;
-import cn.hippo4j.core.executor.manage.GlobalNotifyAlarmManage;
+import cn.hippo4j.core.executor.DynamicThreadPoolExecutor;
+import cn.hippo4j.core.executor.DynamicThreadPoolWrapper;
import cn.hippo4j.core.executor.manage.GlobalThreadPoolManage;
import cn.hippo4j.core.executor.support.ThreadPoolBuilder;
import cn.hippo4j.core.toolkit.ExecutorTraceContextUtil;
import cn.hippo4j.core.toolkit.IdentifyUtil;
import cn.hippo4j.message.enums.NotifyTypeEnum;
import cn.hippo4j.message.request.AlarmNotifyRequest;
-import cn.hippo4j.message.request.ChangeParameterNotifyRequest;
-import cn.hippo4j.message.service.Hippo4jSendMessageService;
-import cn.hippo4j.message.service.ThreadPoolNotifyAlarm;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.CommandLineRunner;
import java.util.List;
import java.util.Objects;
@@ -46,11 +44,11 @@ import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
- * Thread-pool notify alarm handler.
+ * Default thread-pool check alarm handler.
*/
@Slf4j
@RequiredArgsConstructor
-public class ThreadPoolNotifyAlarmHandler implements Runnable, CommandLineRunner {
+public class DefaultThreadPoolCheckAlarmHandler implements Runnable, ThreadPoolCheckAlarm {
private final Hippo4jSendMessageService hippo4jSendMessageService;
@@ -66,11 +64,11 @@ public class ThreadPoolNotifyAlarmHandler implements Runnable, CommandLineRunner
@Value("${spring.dynamic.thread-pool.check-state-interval:5}")
private Integer checkStateInterval;
- private final ScheduledExecutorService ALARM_NOTIFY_EXECUTOR = new ScheduledThreadPoolExecutor(
+ private final ScheduledExecutorService alarmNotifyExecutor = new ScheduledThreadPoolExecutor(
1,
r -> new Thread(r, "client.alarm.notify"));
- private final ExecutorService ASYNC_ALARM_NOTIFY_EXECUTOR = ThreadPoolBuilder.builder()
+ private final ExecutorService asyncAlarmNotifyExecutor = ThreadPoolBuilder.builder()
.poolThreadSize(2, 4)
.threadFactory("client.execute.timeout.alarm")
.allowCoreThreadTimeOut(true)
@@ -81,7 +79,7 @@ public class ThreadPoolNotifyAlarmHandler implements Runnable, CommandLineRunner
@Override
public void run(String... args) throws Exception {
- ALARM_NOTIFY_EXECUTOR.scheduleWithFixedDelay(this, 0, checkStateInterval, TimeUnit.SECONDS);
+ alarmNotifyExecutor.scheduleWithFixedDelay(this, 0, checkStateInterval, TimeUnit.SECONDS);
}
@Override
@@ -104,6 +102,7 @@ public class ThreadPoolNotifyAlarmHandler implements Runnable, CommandLineRunner
* @param threadPoolId thread-pool id
* @param threadPoolExecutor thread-pool executor
*/
+ @Override
public void checkPoolCapacityAlarm(String threadPoolId, ThreadPoolExecutor threadPoolExecutor) {
ThreadPoolNotifyAlarm alarmConfig = GlobalNotifyAlarmManage.get(threadPoolId);
if (Objects.isNull(alarmConfig) || !alarmConfig.getAlarm() || alarmConfig.getCapacityAlarm() <= 0) {
@@ -127,6 +126,7 @@ public class ThreadPoolNotifyAlarmHandler implements Runnable, CommandLineRunner
* @param threadPoolId thread-pool id
* @param threadPoolExecutor thread-pool executor
*/
+ @Override
public void checkPoolActivityAlarm(String threadPoolId, ThreadPoolExecutor threadPoolExecutor) {
ThreadPoolNotifyAlarm alarmConfig = GlobalNotifyAlarmManage.get(threadPoolId);
if (Objects.isNull(alarmConfig) || !alarmConfig.getAlarm() || alarmConfig.getActiveAlarm() <= 0) {
@@ -148,6 +148,7 @@ public class ThreadPoolNotifyAlarmHandler implements Runnable, CommandLineRunner
*
* @param threadPoolId thread-pool id
*/
+ @Override
public void asyncSendRejectedAlarm(String threadPoolId) {
Runnable checkPoolRejectedAlarmTask = () -> {
ThreadPoolNotifyAlarm alarmConfig = GlobalNotifyAlarmManage.get(threadPoolId);
@@ -161,7 +162,7 @@ public class ThreadPoolNotifyAlarmHandler implements Runnable, CommandLineRunner
hippo4jSendMessageService.sendAlarmMessage(NotifyTypeEnum.REJECT, alarmNotifyRequest);
}
};
- ASYNC_ALARM_NOTIFY_EXECUTOR.execute(checkPoolRejectedAlarmTask);
+ asyncAlarmNotifyExecutor.execute(checkPoolRejectedAlarmTask);
}
/**
@@ -172,6 +173,7 @@ public class ThreadPoolNotifyAlarmHandler implements Runnable, CommandLineRunner
* @param executeTimeOut execute time-out
* @param threadPoolExecutor thread-pool executor
*/
+ @Override
public void asyncSendExecuteTimeOutAlarm(String threadPoolId, long executeTime, long executeTimeOut, ThreadPoolExecutor threadPoolExecutor) {
ThreadPoolNotifyAlarm alarmConfig = GlobalNotifyAlarmManage.get(threadPoolId);
if (Objects.isNull(alarmConfig) || !alarmConfig.getAlarm()) {
@@ -188,26 +190,13 @@ public class ThreadPoolNotifyAlarmHandler implements Runnable, CommandLineRunner
alarmNotifyRequest.setExecuteTimeoutTrace(executeTimeoutTrace);
}
Runnable task = () -> hippo4jSendMessageService.sendAlarmMessage(NotifyTypeEnum.TIMEOUT, alarmNotifyRequest);
- ASYNC_ALARM_NOTIFY_EXECUTOR.execute(task);
+ asyncAlarmNotifyExecutor.execute(task);
} catch (Throwable ex) {
log.error("Send thread pool execution timeout alarm error.", ex);
}
}
}
- /**
- * Send pool config change.
- *
- * @param request change parameter notify request
- */
- public void sendPoolConfigChange(ChangeParameterNotifyRequest request) {
- request.setActive(active.toUpperCase());
- String appName = StringUtil.isBlank(itemId) ? applicationName : itemId;
- request.setAppName(appName);
- request.setIdentify(IdentifyUtil.getIdentify());
- hippo4jSendMessageService.sendChangeMessage(request);
- }
-
/**
* Build alarm notify request.
*
diff --git a/hippo4j-message/src/main/java/cn/hippo4j/message/service/DefaultThreadPoolConfigChangeHandler.java b/hippo4j-message/src/main/java/cn/hippo4j/message/service/DefaultThreadPoolConfigChangeHandler.java
new file mode 100644
index 00000000..730edd81
--- /dev/null
+++ b/hippo4j-message/src/main/java/cn/hippo4j/message/service/DefaultThreadPoolConfigChangeHandler.java
@@ -0,0 +1,57 @@
+/*
+ * 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 cn.hippo4j.message.service;
+
+import cn.hippo4j.common.api.ThreadPoolConfigChange;
+import cn.hippo4j.common.toolkit.StringUtil;
+import cn.hippo4j.core.toolkit.IdentifyUtil;
+import cn.hippo4j.message.request.ChangeParameterNotifyRequest;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+
+/**
+ * Default thread-pool config change handler.
+ */
+@RequiredArgsConstructor
+public class DefaultThreadPoolConfigChangeHandler implements ThreadPoolConfigChange {
+
+ @Value("${spring.profiles.active:UNKNOWN}")
+ private String active;
+
+ @Value("${spring.dynamic.thread-pool.item-id:}")
+ private String itemId;
+
+ @Value("${spring.application.name:UNKNOWN}")
+ private String applicationName;
+
+ private final Hippo4jSendMessageService hippo4jSendMessageService;
+
+ /**
+ * Send pool config change.
+ *
+ * @param requestParam change parameter notify request
+ */
+ @Override
+ public void sendPoolConfigChange(ChangeParameterNotifyRequest requestParam) {
+ requestParam.setActive(active.toUpperCase());
+ String appName = StringUtil.isBlank(itemId) ? applicationName : itemId;
+ requestParam.setAppName(appName);
+ requestParam.setIdentify(IdentifyUtil.getIdentify());
+ hippo4jSendMessageService.sendChangeMessage(requestParam);
+ }
+}
diff --git a/hippo4j-core/src/main/java/cn/hippo4j/core/executor/manage/GlobalNotifyAlarmManage.java b/hippo4j-message/src/main/java/cn/hippo4j/message/service/GlobalNotifyAlarmManage.java
similarity index 94%
rename from hippo4j-core/src/main/java/cn/hippo4j/core/executor/manage/GlobalNotifyAlarmManage.java
rename to hippo4j-message/src/main/java/cn/hippo4j/message/service/GlobalNotifyAlarmManage.java
index fee2a1ee..c9f9fdc8 100644
--- a/hippo4j-core/src/main/java/cn/hippo4j/core/executor/manage/GlobalNotifyAlarmManage.java
+++ b/hippo4j-message/src/main/java/cn/hippo4j/message/service/GlobalNotifyAlarmManage.java
@@ -15,9 +15,7 @@
* limitations under the License.
*/
-package cn.hippo4j.core.executor.manage;
-
-import cn.hippo4j.message.service.ThreadPoolNotifyAlarm;
+package cn.hippo4j.message.service;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
diff --git a/hippo4j-message/src/main/java/cn/hippo4j/message/service/Hippo4jBaseSendMessageService.java b/hippo4j-message/src/main/java/cn/hippo4j/message/service/Hippo4jBaseSendMessageService.java
index 2f5eedbd..0792d6f1 100644
--- a/hippo4j-message/src/main/java/cn/hippo4j/message/service/Hippo4jBaseSendMessageService.java
+++ b/hippo4j-message/src/main/java/cn/hippo4j/message/service/Hippo4jBaseSendMessageService.java
@@ -46,7 +46,7 @@ public class Hippo4jBaseSendMessageService implements Hippo4jSendMessageService,
private final AlarmControlHandler alarmControlHandler;
@Getter
- public final Map> notifyConfigs = new HashMap<>();
+ private final Map> notifyConfigs = new HashMap<>();
private final Map sendMessageHandlers = new HashMap<>();
diff --git a/hippo4j-message/src/main/java/cn/hippo4j/message/service/SendMessageHandler.java b/hippo4j-message/src/main/java/cn/hippo4j/message/service/SendMessageHandler.java
index 9e61f362..37e939bf 100644
--- a/hippo4j-message/src/main/java/cn/hippo4j/message/service/SendMessageHandler.java
+++ b/hippo4j-message/src/main/java/cn/hippo4j/message/service/SendMessageHandler.java
@@ -18,7 +18,7 @@
package cn.hippo4j.message.service;
import cn.hippo4j.message.dto.NotifyConfigDTO;
-import cn.hippo4j.message.request.base.NotifyRequest;
+import cn.hippo4j.common.api.NotifyRequest;
/**
* Send message handler.
diff --git a/hippo4j-message/src/main/resources/message/robot/dynamic-thread-pool/ding-alarm.txt b/hippo4j-message/src/main/resources/message/robot/dynamic-thread-pool/ding-alarm.txt
index 7fda29d7..094e4505 100644
--- a/hippo4j-message/src/main/resources/message/robot/dynamic-thread-pool/ding-alarm.txt
+++ b/hippo4j-message/src/main/resources/message/robot/dynamic-thread-pool/ding-alarm.txt
@@ -34,7 +34,7 @@
---
- ${timout-content}
+ ${timeout-content}
拒绝策略:%s
diff --git a/hippo4j-message/src/main/resources/message/robot/dynamic-thread-pool/wechat-alarm.txt b/hippo4j-message/src/main/resources/message/robot/dynamic-thread-pool/wechat-alarm.txt
index 00dd33b2..1e1aa9c4 100644
--- a/hippo4j-message/src/main/resources/message/robot/dynamic-thread-pool/wechat-alarm.txt
+++ b/hippo4j-message/src/main/resources/message/robot/dynamic-thread-pool/wechat-alarm.txt
@@ -14,7 +14,7 @@
> 队列元素个数:%s
> 队列剩余个数:%s
> 拒绝策略:%s
-> 拒绝策略执行次数:%s ${timout-content}
+> 拒绝策略执行次数:%s ${timeout-content}
> OWNER:<@%s>
> 提示:%d 分钟内此线程池不会重复告警(可配置)
diff --git a/hippo4j-monitor/hippo4j-monitor-base/src/main/java/cn/hippo4j/monitor/base/AbstractDynamicThreadPoolMonitor.java b/hippo4j-monitor/hippo4j-monitor-base/src/main/java/cn/hippo4j/monitor/base/AbstractDynamicThreadPoolMonitor.java
index 81943cbd..2e8a77ac 100644
--- a/hippo4j-monitor/hippo4j-monitor-base/src/main/java/cn/hippo4j/monitor/base/AbstractDynamicThreadPoolMonitor.java
+++ b/hippo4j-monitor/hippo4j-monitor-base/src/main/java/cn/hippo4j/monitor/base/AbstractDynamicThreadPoolMonitor.java
@@ -42,9 +42,6 @@ public abstract class AbstractDynamicThreadPoolMonitor implements DynamicThreadP
@Override
public void collect() {
List listDynamicThreadPoolId = GlobalThreadPoolManage.listThreadPoolId();
- for (String each : listDynamicThreadPoolId) {
- ThreadPoolRunStateInfo poolRunState = threadPoolRunStateHandler.getPoolRunState(each);
- execute(poolRunState);
- }
+ listDynamicThreadPoolId.forEach(each -> execute(threadPoolRunStateHandler.getPoolRunState(each)));
}
}
diff --git a/hippo4j-monitor/hippo4j-monitor-base/src/main/java/cn/hippo4j/monitor/base/AdapterThreadPoolMonitor.java b/hippo4j-monitor/hippo4j-monitor-base/src/main/java/cn/hippo4j/monitor/base/AdapterThreadPoolMonitor.java
index cebdc7e2..520b4ffd 100644
--- a/hippo4j-monitor/hippo4j-monitor-base/src/main/java/cn/hippo4j/monitor/base/AdapterThreadPoolMonitor.java
+++ b/hippo4j-monitor/hippo4j-monitor-base/src/main/java/cn/hippo4j/monitor/base/AdapterThreadPoolMonitor.java
@@ -21,5 +21,4 @@ package cn.hippo4j.monitor.base;
* Adapter thread-pool monitor.
*/
public interface AdapterThreadPoolMonitor extends ThreadPoolMonitor {
-
}
diff --git a/hippo4j-monitor/hippo4j-monitor-base/src/main/java/cn/hippo4j/monitor/base/DynamicThreadPoolMonitor.java b/hippo4j-monitor/hippo4j-monitor-base/src/main/java/cn/hippo4j/monitor/base/DynamicThreadPoolMonitor.java
index e3135db4..7e8c7452 100644
--- a/hippo4j-monitor/hippo4j-monitor-base/src/main/java/cn/hippo4j/monitor/base/DynamicThreadPoolMonitor.java
+++ b/hippo4j-monitor/hippo4j-monitor-base/src/main/java/cn/hippo4j/monitor/base/DynamicThreadPoolMonitor.java
@@ -21,5 +21,4 @@ package cn.hippo4j.monitor.base;
* Dynamic thread-pool monitor.
*/
public interface DynamicThreadPoolMonitor extends ThreadPoolMonitor {
-
}
diff --git a/hippo4j-monitor/hippo4j-monitor-base/src/main/java/cn/hippo4j/monitor/base/WebThreadPoolMonitor.java b/hippo4j-monitor/hippo4j-monitor-base/src/main/java/cn/hippo4j/monitor/base/WebThreadPoolMonitor.java
index 333c0dbd..75b40fb7 100644
--- a/hippo4j-monitor/hippo4j-monitor-base/src/main/java/cn/hippo4j/monitor/base/WebThreadPoolMonitor.java
+++ b/hippo4j-monitor/hippo4j-monitor-base/src/main/java/cn/hippo4j/monitor/base/WebThreadPoolMonitor.java
@@ -21,5 +21,4 @@ package cn.hippo4j.monitor.base;
* Web thread-pool monitor.
*/
public interface WebThreadPoolMonitor extends ThreadPoolMonitor {
-
}
diff --git a/hippo4j-monitor/hippo4j-monitor-elasticsearch/pom.xml b/hippo4j-monitor/hippo4j-monitor-elasticsearch/pom.xml
index 3ced6cef..0fcd444c 100644
--- a/hippo4j-monitor/hippo4j-monitor-elasticsearch/pom.xml
+++ b/hippo4j-monitor/hippo4j-monitor-elasticsearch/pom.xml
@@ -9,10 +9,6 @@
hippo4j-monitor-elasticsearch
-
- 6.8.17
-
-
cn.hippo4j
diff --git a/hippo4j-monitor/hippo4j-monitor-elasticsearch/src/main/java/cn/hippo4j/monitor/elasticsearch/DynamicThreadPoolElasticSearchMonitorHandler.java b/hippo4j-monitor/hippo4j-monitor-elasticsearch/src/main/java/cn/hippo4j/monitor/elasticsearch/DynamicThreadPoolElasticSearchMonitorHandler.java
index 36101cb8..203d2457 100644
--- a/hippo4j-monitor/hippo4j-monitor-elasticsearch/src/main/java/cn/hippo4j/monitor/elasticsearch/DynamicThreadPoolElasticSearchMonitorHandler.java
+++ b/hippo4j-monitor/hippo4j-monitor-elasticsearch/src/main/java/cn/hippo4j/monitor/elasticsearch/DynamicThreadPoolElasticSearchMonitorHandler.java
@@ -25,6 +25,8 @@ import cn.hippo4j.common.toolkit.JSONUtil;
import cn.hippo4j.monitor.base.AbstractDynamicThreadPoolMonitor;
import cn.hippo4j.monitor.base.MonitorTypeEnum;
import cn.hippo4j.monitor.elasticsearch.model.ElasticSearchThreadPoolRunStateInfo;
+import lombok.Builder;
+import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.admin.indices.alias.Alias;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
@@ -63,7 +65,7 @@ public class DynamicThreadPoolElasticSearchMonitorHandler extends AbstractDynami
List rawMapping = FileUtil.readLines(Thread.currentThread().getContextClassLoader().getResource("mapping.json").getPath(), StandardCharsets.UTF_8);
String mapping = String.join(" ", rawMapping);
// if index doesn't exsit, this function may try to create one, but recommend to create index manually.
- this.createIndex(indexName, "_doc", mapping, null, null, null);
+ this.createIndex(EsIndex.builder().index(indexName).type("_doc").mapping(mapping).build());
}
esThreadPoolRunStateInfo.setApplicationName(applicationName);
esThreadPoolRunStateInfo.setId(indexName + "-" + System.currentTimeMillis());
@@ -104,20 +106,20 @@ public class DynamicThreadPoolElasticSearchMonitorHandler extends AbstractDynami
return isIndexExist.get();
}
- public void createIndex(String index, String type, String mapping, Integer shards, Integer replicas, String alias) {
+ public void createIndex(EsIndex esIndex) {
RestHighLevelClient client = ElasticSearchClientHolder.getClient();
boolean acknowledged = false;
- CreateIndexRequest request = new CreateIndexRequest(index);
- if (StringUtils.hasText(mapping)) {
- request.mapping(type, mapping, XContentType.JSON);
+ CreateIndexRequest request = new CreateIndexRequest(esIndex.getIndex());
+ if (StringUtils.hasText(esIndex.getMapping())) {
+ request.mapping(esIndex.getType(), esIndex.getMapping(), XContentType.JSON);
}
- if (!Objects.isNull(shards) && !Objects.isNull(replicas)) {
+ if (!Objects.isNull(esIndex.getShards()) && !Objects.isNull(esIndex.getReplicas())) {
request.settings(Settings.builder()
- .put("index.number_of_shards", shards) // 5
- .put("index.number_of_replicas", replicas));// 1
+ .put("index.number_of_shards", esIndex.getShards())
+ .put("index.number_of_replicas", esIndex.getReplicas()));
}
- if (StringUtils.hasText(alias)) {
- request.alias(new Alias(alias));
+ if (StringUtils.hasText(esIndex.getAlias())) {
+ request.alias(new Alias(esIndex.getAlias()));
}
try {
CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
@@ -138,4 +140,18 @@ public class DynamicThreadPoolElasticSearchMonitorHandler extends AbstractDynami
public String getType() {
return MonitorTypeEnum.ELASTICSEARCH.name().toLowerCase();
}
+
+ /**
+ * Es Index
+ */
+ @Getter
+ @Builder
+ private static class EsIndex {
+ String index;
+ String type;
+ String mapping;
+ Integer shards;
+ Integer replicas;
+ String alias;
+ }
}
diff --git a/hippo4j-monitor/hippo4j-monitor-elasticsearch/src/main/java/cn/hippo4j/monitor/elasticsearch/ElasticSearchClientHolder.java b/hippo4j-monitor/hippo4j-monitor-elasticsearch/src/main/java/cn/hippo4j/monitor/elasticsearch/ElasticSearchClientHolder.java
index f30bbdc6..ba428722 100644
--- a/hippo4j-monitor/hippo4j-monitor-elasticsearch/src/main/java/cn/hippo4j/monitor/elasticsearch/ElasticSearchClientHolder.java
+++ b/hippo4j-monitor/hippo4j-monitor-elasticsearch/src/main/java/cn/hippo4j/monitor/elasticsearch/ElasticSearchClientHolder.java
@@ -28,8 +28,6 @@ import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.core.env.Environment;
-import java.io.PrintWriter;
-import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
@@ -66,9 +64,7 @@ public class ElasticSearchClientHolder {
log.info("[ES RestHighLevelClient] success to connect es!host:{},scheme:{}", host, scheme);
return client;
} catch (Exception ex) {
- StringWriter stackTrace = new StringWriter();
- ex.printStackTrace(new PrintWriter(stackTrace));
- log.error("[ES RestHighLevelClient] fail to connect es! cause:{}", stackTrace);
+ log.error("[ES RestHighLevelClient] fail to connect es! cause:", ex);
}
return null;
}
diff --git a/hippo4j-monitor/hippo4j-monitor-elasticsearch/src/main/java/cn/hippo4j/monitor/elasticsearch/model/ElasticSearchThreadPoolRunStateInfo.java b/hippo4j-monitor/hippo4j-monitor-elasticsearch/src/main/java/cn/hippo4j/monitor/elasticsearch/model/ElasticSearchThreadPoolRunStateInfo.java
index cc4da6e1..e72e9a27 100644
--- a/hippo4j-monitor/hippo4j-monitor-elasticsearch/src/main/java/cn/hippo4j/monitor/elasticsearch/model/ElasticSearchThreadPoolRunStateInfo.java
+++ b/hippo4j-monitor/hippo4j-monitor-elasticsearch/src/main/java/cn/hippo4j/monitor/elasticsearch/model/ElasticSearchThreadPoolRunStateInfo.java
@@ -28,7 +28,7 @@ import lombok.Setter;
@Setter
public class ElasticSearchThreadPoolRunStateInfo extends ThreadPoolRunStateInfo {
- private String Id;
+ private String id;
private String applicationName;
}
diff --git a/hippo4j-monitor/hippo4j-monitor-micrometer/src/main/java/cn/hippo4j/monitor/micrometer/AdapterThreadPoolMicrometerMonitorHandler.java b/hippo4j-monitor/hippo4j-monitor-micrometer/src/main/java/cn/hippo4j/monitor/micrometer/AdapterThreadPoolMicrometerMonitorHandler.java
index 697ca2cf..b5e20608 100644
--- a/hippo4j-monitor/hippo4j-monitor-micrometer/src/main/java/cn/hippo4j/monitor/micrometer/AdapterThreadPoolMicrometerMonitorHandler.java
+++ b/hippo4j-monitor/hippo4j-monitor-micrometer/src/main/java/cn/hippo4j/monitor/micrometer/AdapterThreadPoolMicrometerMonitorHandler.java
@@ -35,21 +35,21 @@ import java.util.concurrent.ConcurrentHashMap;
*/
public class AdapterThreadPoolMicrometerMonitorHandler extends AbstractAdapterThreadPoolMonitor {
- private final static String METRIC_NAME_PREFIX = "adapter.thread-pool";
+ private static final String METRIC_NAME_PREFIX = "adapter.thread-pool";
- private final static String ADAPTER_THREAD_POOL_ID_TAG = METRIC_NAME_PREFIX + ".id";
+ private static final String ADAPTER_THREAD_POOL_ID_TAG = METRIC_NAME_PREFIX + ".id";
- private final static String APPLICATION_NAME_TAG = "application.name";
+ private static final String APPLICATION_NAME_TAG = "application.name";
- private final Map RUN_STATE_CACHE = new ConcurrentHashMap<>();
+ private final Map runStateCache = new ConcurrentHashMap<>();
@Override
protected void execute(ThreadPoolAdapterState threadPoolAdapterState) {
- ThreadPoolAdapterState stateInfo = RUN_STATE_CACHE.get(threadPoolAdapterState.getThreadPoolKey());
- if (stateInfo == null) {
- RUN_STATE_CACHE.put(threadPoolAdapterState.getThreadPoolKey(), threadPoolAdapterState);
- } else {
+ ThreadPoolAdapterState stateInfo = runStateCache.get(threadPoolAdapterState.getThreadPoolKey());
+ if (stateInfo != null) {
BeanUtil.convert(threadPoolAdapterState, stateInfo);
+ } else {
+ runStateCache.put(threadPoolAdapterState.getThreadPoolKey(), threadPoolAdapterState);
}
Environment environment = ApplicationContextHolder.getInstance().getEnvironment();
String applicationName = environment.getProperty("spring.application.name", "application");
diff --git a/hippo4j-monitor/hippo4j-monitor-micrometer/src/main/java/cn/hippo4j/monitor/micrometer/DynamicThreadPoolMicrometerMonitorHandler.java b/hippo4j-monitor/hippo4j-monitor-micrometer/src/main/java/cn/hippo4j/monitor/micrometer/DynamicThreadPoolMicrometerMonitorHandler.java
index 5b2cc068..19dac923 100644
--- a/hippo4j-monitor/hippo4j-monitor-micrometer/src/main/java/cn/hippo4j/monitor/micrometer/DynamicThreadPoolMicrometerMonitorHandler.java
+++ b/hippo4j-monitor/hippo4j-monitor-micrometer/src/main/java/cn/hippo4j/monitor/micrometer/DynamicThreadPoolMicrometerMonitorHandler.java
@@ -35,21 +35,21 @@ import java.util.concurrent.ConcurrentHashMap;
*/
public class DynamicThreadPoolMicrometerMonitorHandler extends AbstractDynamicThreadPoolMonitor {
- private final static String METRIC_NAME_PREFIX = "dynamic.thread-pool";
+ private static final String METRIC_NAME_PREFIX = "dynamic.thread-pool";
- private final static String DYNAMIC_THREAD_POOL_ID_TAG = METRIC_NAME_PREFIX + ".id";
+ private static final String DYNAMIC_THREAD_POOL_ID_TAG = METRIC_NAME_PREFIX + ".id";
- private final static String APPLICATION_NAME_TAG = "application.name";
+ private static final String APPLICATION_NAME_TAG = "application.name";
- private final Map RUN_STATE_CACHE = new ConcurrentHashMap<>();
+ private final Map runStateCache = new ConcurrentHashMap<>();
@Override
protected void execute(ThreadPoolRunStateInfo poolRunStateInfo) {
- ThreadPoolRunStateInfo stateInfo = RUN_STATE_CACHE.get(poolRunStateInfo.getTpId());
- if (stateInfo == null) {
- RUN_STATE_CACHE.put(poolRunStateInfo.getTpId(), poolRunStateInfo);
- } else {
+ ThreadPoolRunStateInfo stateInfo = runStateCache.get(poolRunStateInfo.getTpId());
+ if (stateInfo != null) {
BeanUtil.convert(poolRunStateInfo, stateInfo);
+ } else {
+ runStateCache.put(poolRunStateInfo.getTpId(), poolRunStateInfo);
}
Environment environment = ApplicationContextHolder.getInstance().getEnvironment();
String applicationName = environment.getProperty("spring.application.name", "application");
diff --git a/hippo4j-monitor/hippo4j-monitor-micrometer/src/main/java/cn/hippo4j/monitor/micrometer/WebThreadPoolMicrometerMonitorHandler.java b/hippo4j-monitor/hippo4j-monitor-micrometer/src/main/java/cn/hippo4j/monitor/micrometer/WebThreadPoolMicrometerMonitorHandler.java
index e7042a04..078cb8c1 100644
--- a/hippo4j-monitor/hippo4j-monitor-micrometer/src/main/java/cn/hippo4j/monitor/micrometer/WebThreadPoolMicrometerMonitorHandler.java
+++ b/hippo4j-monitor/hippo4j-monitor-micrometer/src/main/java/cn/hippo4j/monitor/micrometer/WebThreadPoolMicrometerMonitorHandler.java
@@ -35,21 +35,21 @@ import java.util.concurrent.ConcurrentHashMap;
*/
public class WebThreadPoolMicrometerMonitorHandler extends AbstractWebThreadPoolMonitor {
- private final static String METRIC_NAME_PREFIX = "web.thread-pool";
+ private static final String METRIC_NAME_PREFIX = "web.thread-pool";
- private final static String APPLICATION_NAME_TAG = "application.name";
+ private static final String APPLICATION_NAME_TAG = "application.name";
- private final Map RUN_STATE_CACHE = new ConcurrentHashMap<>();
+ private final Map runStateCache = new ConcurrentHashMap<>();
@Override
protected void execute(ThreadPoolRunStateInfo webThreadPoolRunStateInfo) {
Environment environment = ApplicationContextHolder.getInstance().getEnvironment();
String applicationName = environment.getProperty("spring.application.name", "application");
- ThreadPoolRunStateInfo stateInfo = RUN_STATE_CACHE.get(applicationName);
- if (stateInfo == null) {
- RUN_STATE_CACHE.put(applicationName, webThreadPoolRunStateInfo);
- } else {
+ ThreadPoolRunStateInfo stateInfo = runStateCache.get(applicationName);
+ if (stateInfo != null) {
BeanUtil.convert(webThreadPoolRunStateInfo, stateInfo);
+ } else {
+ runStateCache.put(applicationName, webThreadPoolRunStateInfo);
}
Iterable tags = CollectionUtil.newArrayList(Tag.of(APPLICATION_NAME_TAG, applicationName));
Metrics.gauge(metricName("current.load"), tags, webThreadPoolRunStateInfo, ThreadPoolRunStateInfo::getSimpleCurrentLoad);
diff --git a/hippo4j-monitor/pom.xml b/hippo4j-monitor/pom.xml
index 8550b18c..f7a28f85 100644
--- a/hippo4j-monitor/pom.xml
+++ b/hippo4j-monitor/pom.xml
@@ -16,35 +16,4 @@
hippo4j-monitor-local-loghippo4j-monitor-micrometer
-
-
-
-
- org.apache.maven.plugins
- maven-jar-plugin
-
-
-
- ${project.artifactId}
- ${project.version}
- ${maven.build.timestamp}
- chen.ma
-
-
-
-
-
- org.apache.maven.plugins
- maven-javadoc-plugin
- 2.10.3
-
-
-
- jar
-
-
-
-
-
-
diff --git a/hippo4j-rpc/pom.xml b/hippo4j-rpc/pom.xml
new file mode 100644
index 00000000..49058de8
--- /dev/null
+++ b/hippo4j-rpc/pom.xml
@@ -0,0 +1,32 @@
+
+
+ 4.0.0
+
+ cn.hippo4j
+ hippo4j-all
+ ${revision}
+
+ hippo4j-rpc
+
+
+
+ cn.hippo4j
+ hippo4j-common
+ ${revision}
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.projectlombok
+ lombok
+
+
+ io.netty
+ netty-all
+
+
+
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/client/Client.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/client/Client.java
similarity index 82%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/client/Client.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/client/Client.java
index e2c4a64e..81957ce5 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/client/Client.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/client/Client.java
@@ -15,10 +15,10 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.client;
+package cn.hippo4j.rpc.client;
-import cn.hippo4j.config.rpc.request.Request;
-import cn.hippo4j.config.rpc.response.Response;
+import cn.hippo4j.rpc.request.Request;
+import cn.hippo4j.rpc.response.Response;
import java.io.Closeable;
@@ -31,4 +31,12 @@ public interface Client extends Closeable {
* Start the client and try to send and receive data
*/
Response connection(Request request);
+
+ /**
+ * Check whether the client is active
+ *
+ * @return Whether active
+ */
+ boolean isActive();
+
}
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/client/ClientConnection.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/client/ClientConnection.java
similarity index 86%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/client/ClientConnection.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/client/ClientConnection.java
index f8b22c62..8d04a213 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/client/ClientConnection.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/client/ClientConnection.java
@@ -15,11 +15,11 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.client;
+package cn.hippo4j.rpc.client;
-import cn.hippo4j.config.rpc.handler.Connection;
-import cn.hippo4j.config.rpc.request.Request;
-import cn.hippo4j.config.rpc.response.Response;
+import cn.hippo4j.rpc.handler.Connection;
+import cn.hippo4j.rpc.request.Request;
+import cn.hippo4j.rpc.response.Response;
/**
* Applicable to client connections
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/client/NettyClientConnection.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/client/NettyClientConnection.java
similarity index 68%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/client/NettyClientConnection.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/client/NettyClientConnection.java
index 0b02c48c..a725ed6a 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/client/NettyClientConnection.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/client/NettyClientConnection.java
@@ -15,21 +15,23 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.client;
+package cn.hippo4j.rpc.client;
-import cn.hippo4j.config.rpc.exception.TimeOutException;
-import cn.hippo4j.config.rpc.process.ActivePostProcess;
-import cn.hippo4j.config.rpc.request.Request;
-import cn.hippo4j.config.rpc.response.Response;
-import cn.hippo4j.config.rpc.support.NettyConnectPool;
-import cn.hippo4j.config.rpc.support.NettyConnectPoolHolder;
-import cn.hippo4j.config.rpc.support.ResultHolder;
import cn.hippo4j.common.toolkit.Assert;
import cn.hippo4j.common.web.exception.IllegalException;
+import cn.hippo4j.rpc.exception.TimeOutException;
+import cn.hippo4j.rpc.process.ActivePostProcess;
+import cn.hippo4j.rpc.process.ActiveProcessChain;
+import cn.hippo4j.rpc.request.Request;
+import cn.hippo4j.rpc.response.Response;
+import cn.hippo4j.rpc.support.NettyConnectPool;
+import cn.hippo4j.rpc.support.NettyConnectPoolHolder;
+import cn.hippo4j.rpc.support.ResultHolder;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.pool.ChannelPoolHandler;
import lombok.extern.slf4j.Slf4j;
import java.util.LinkedList;
@@ -46,47 +48,50 @@ public class NettyClientConnection implements ClientConnection {
Integer port;
// Obtain the connection timeout period. The default value is 30s
long timeout = 30000L;
- Channel channel;
EventLoopGroup worker = new NioEventLoopGroup();
- List activeProcesses;
- ChannelFuture future;
+ ActiveProcessChain activeProcessChain;
NettyConnectPool connectionPool;
+ ChannelFuture future;
+ Channel channel;
public NettyClientConnection(String host, int port,
- List activeProcesses) {
+ List activeProcesses,
+ ChannelPoolHandler handler) {
Assert.notNull(worker);
this.host = host;
this.port = port;
- this.activeProcesses = activeProcesses;
- this.connectionPool = NettyConnectPoolHolder.getPool(host, port, timeout, worker);
+ this.activeProcessChain = new ActiveProcessChain(activeProcesses);
+ this.connectionPool = NettyConnectPoolHolder.getPool(host, port, timeout, worker, handler);
}
- public NettyClientConnection(String host, int port) {
- this(host, port, new LinkedList<>());
+ public NettyClientConnection(String host, int port, ChannelPoolHandler handler) {
+ this(host, port, new LinkedList<>(), handler);
}
@Override
public Response connect(Request request) {
- preHandlers(request);
+ activeProcessChain.applyPreHandle(request);
this.channel = connectionPool.acquire(timeout);
+ Response response = null;
try {
String key = request.getKey();
this.future = channel.writeAndFlush(request);
log.info("Call successful, target address is {}:{}, request key is {}", host, port, key);
// Wait for execution to complete
- ResultHolder.put(key, Thread.currentThread());
+ ResultHolder.putThread(key, Thread.currentThread());
LockSupport.parkNanos(timeout() * 1000000);
- Response response = ResultHolder.get(key);
+ response = ResultHolder.get(key);
if (response == null) {
throw new TimeOutException("Timeout waiting for server-side response");
}
- postHandlers(request, response);
+ activeProcessChain.applyPostHandle(request, response);
log.info("The response from {}:{} was received successfully with the response key {}.", host, port, key);
return response;
} catch (Exception ex) {
- afterCompletions(request, null, ex);
+ activeProcessChain.afterCompletion(request, response, ex);
throw new IllegalException(ex);
} finally {
+ activeProcessChain.afterCompletion(request, response, null);
connectionPool.release(this.channel);
}
}
@@ -111,22 +116,8 @@ public class NettyClientConnection implements ClientConnection {
this.channel.close();
}
- private void preHandlers(Request request) {
- for (ActivePostProcess process : activeProcesses) {
- process.preHandler(request);
- }
- }
-
- private void postHandlers(Request request, Response response) {
- for (ActivePostProcess process : activeProcesses) {
- process.postHandler(request, response);
- }
- }
-
- private void afterCompletions(Request request, Response response, Exception e) {
- for (ActivePostProcess process : activeProcesses) {
- process.afterCompletion(request, response, e);
- }
+ @Override
+ public boolean isActive() {
+ return channel.isActive();
}
-
}
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/client/RPCClient.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/client/RPCClient.java
similarity index 87%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/client/RPCClient.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/client/RPCClient.java
index 8b8451c8..e3094076 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/client/RPCClient.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/client/RPCClient.java
@@ -15,10 +15,10 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.client;
+package cn.hippo4j.rpc.client;
-import cn.hippo4j.config.rpc.request.Request;
-import cn.hippo4j.config.rpc.response.Response;
+import cn.hippo4j.rpc.request.Request;
+import cn.hippo4j.rpc.response.Response;
import java.io.IOException;
@@ -38,6 +38,11 @@ public class RPCClient implements Client {
return clientConnection.connect(request);
}
+ @Override
+ public boolean isActive() {
+ return clientConnection.isActive();
+ }
+
/**
* Close the client and release all connections.
*
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/coder/CompactObjectOutputStream.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/coder/CompactObjectOutputStream.java
similarity index 97%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/coder/CompactObjectOutputStream.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/coder/CompactObjectOutputStream.java
index a8592ef0..599cf118 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/coder/CompactObjectOutputStream.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/coder/CompactObjectOutputStream.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.coder;
+package cn.hippo4j.rpc.coder;
import java.io.IOException;
import java.io.ObjectOutputStream;
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/coder/NettyDecoder.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/coder/NettyDecoder.java
similarity index 95%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/coder/NettyDecoder.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/coder/NettyDecoder.java
index 334fa4c5..42223e44 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/coder/NettyDecoder.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/coder/NettyDecoder.java
@@ -15,9 +15,9 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.coder;
+package cn.hippo4j.rpc.coder;
-import cn.hippo4j.config.rpc.exception.CoderException;
+import cn.hippo4j.rpc.exception.CoderException;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.serialization.ClassResolver;
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/coder/NettyEncoder.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/coder/NettyEncoder.java
similarity index 95%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/coder/NettyEncoder.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/coder/NettyEncoder.java
index 48ebe628..856aae2a 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/coder/NettyEncoder.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/coder/NettyEncoder.java
@@ -15,9 +15,9 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.coder;
+package cn.hippo4j.rpc.coder;
-import cn.hippo4j.config.rpc.exception.CoderException;
+import cn.hippo4j.rpc.exception.CoderException;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufOutputStream;
import io.netty.channel.ChannelHandlerContext;
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/discovery/DiscoveryAdapter.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/discovery/DiscoveryAdapter.java
similarity index 96%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/discovery/DiscoveryAdapter.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/discovery/DiscoveryAdapter.java
index d91fe15f..3a788f30 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/discovery/DiscoveryAdapter.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/discovery/DiscoveryAdapter.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.discovery;
+package cn.hippo4j.rpc.discovery;
import java.net.InetSocketAddress;
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/exception/CoderException.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/exception/CoderException.java
similarity index 97%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/exception/CoderException.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/exception/CoderException.java
index aa0e107a..5ac64a5a 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/exception/CoderException.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/exception/CoderException.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.exception;
+package cn.hippo4j.rpc.exception;
/**
* During decoding and encoding, if an exception occurs, an exception of type {@link CoderException} is thrown,
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/exception/ConnectionException.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/exception/ConnectionException.java
similarity index 97%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/exception/ConnectionException.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/exception/ConnectionException.java
index e43a0465..87e29423 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/exception/ConnectionException.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/exception/ConnectionException.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.exception;
+package cn.hippo4j.rpc.exception;
/**
* If an exception occurs during the connection between the server and the client, an exception of type
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/exception/TimeOutException.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/exception/TimeOutException.java
similarity index 97%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/exception/TimeOutException.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/exception/TimeOutException.java
index 50b902d9..ef808b57 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/exception/TimeOutException.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/exception/TimeOutException.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.exception;
+package cn.hippo4j.rpc.exception;
/**
* If there is a timeout between the server and the client, you will get a {@link TimeOutException},
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/handler/NettyClientTakeHandler.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/AbstractNettyTakeHandler.java
similarity index 66%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/handler/NettyClientTakeHandler.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/AbstractNettyTakeHandler.java
index 9e459a4b..08fac1db 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/handler/NettyClientTakeHandler.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/AbstractNettyTakeHandler.java
@@ -15,33 +15,26 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.handler;
+package cn.hippo4j.rpc.handler;
-import cn.hippo4j.config.rpc.exception.ConnectionException;
-import cn.hippo4j.config.rpc.support.ResultHolder;
-import cn.hippo4j.config.rpc.response.Response;
-import cn.hippo4j.common.web.exception.IllegalException;
+import cn.hippo4j.rpc.exception.ConnectionException;
+import cn.hippo4j.rpc.response.Response;
+import cn.hippo4j.rpc.support.ResultHolder;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
/**
- * Interconnect with the netty mediation layer
+ * the abstract base of {@link ConnectHandler} and {@link ChannelInboundHandlerAdapter}
*/
-public class NettyClientTakeHandler extends ChannelInboundHandlerAdapter implements ConnectHandler {
-
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) {
- try {
- Response response = (Response) msg;
- handler(response);
- ctx.flush();
- } catch (Exception e) {
- ctx.close();
- throw new IllegalException(e);
- }
- }
+public abstract class AbstractNettyTakeHandler extends ChannelInboundHandlerAdapter implements ConnectHandler {
+ /**
+ * Manual disconnection is used here in case the server and client are disconnected due to a sudden exception
+ *
+ * @param ctx the context
+ * @param cause the throwable
+ */
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
super.exceptionCaught(ctx, cause);
@@ -53,9 +46,15 @@ public class NettyClientTakeHandler extends ChannelInboundHandlerAdapter impleme
}
}
+ /**
+ * This is a generic process that puts in the result and wakes up the thread
+ *
+ * @param response response
+ */
@Override
public void handler(Response response) {
ResultHolder.put(response.getKey(), response);
ResultHolder.wake(response.getKey());
}
+
}
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/handler/ConnectHandler.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/ConnectHandler.java
similarity index 80%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/handler/ConnectHandler.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/ConnectHandler.java
index 4170e5b5..21e36fb9 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/handler/ConnectHandler.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/ConnectHandler.java
@@ -15,15 +15,16 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.handler;
+package cn.hippo4j.rpc.handler;
-import cn.hippo4j.config.rpc.request.Request;
-import cn.hippo4j.config.rpc.response.Response;
+import cn.hippo4j.rpc.request.Request;
+import cn.hippo4j.rpc.response.Response;
/**
* The handler in each connection, where the specific behavior of the connection
* must be specified, such as serialization and parsing, requesting and receiving
- * requests, and so on
+ * requests, and so on
+ *
*/
public interface ConnectHandler {
@@ -32,12 +33,13 @@ public interface ConnectHandler {
*
* @param request request
*/
- default Response handler(Request request) {
+ default Response sendHandler(Request request) {
return null;
}
/**
- * Processing after receiving Response
+ * Processing after receiving Response
+ * This is mainly for subsequent processing of the results
*
* @param response response
*/
diff --git a/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/Connection.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/Connection.java
new file mode 100644
index 00000000..77ce2211
--- /dev/null
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/Connection.java
@@ -0,0 +1,41 @@
+/*
+ * 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 cn.hippo4j.rpc.handler;
+
+import java.io.Closeable;
+
+/**
+ * Represents a network request connection and provides IO layer support
+ */
+public interface Connection extends Closeable {
+
+ /**
+ * Gets the state of the connection, which is interpreted differently by different programs
+ *
+ * Client: Active connection indicates that a connection is being maintained with the server.
+ * Inactive connection indicates that no connection is being established with the server
+ *
+ * Server: The active connection indicates that the server has been started, is receiving ports,
+ * and can obtain requests at any time. The inactive connection indicates that the server has been
+ * shut down and the ports have been released
+ *
+ * @return Whether active
+ */
+ boolean isActive();
+
+}
diff --git a/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/HandlerManager.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/HandlerManager.java
new file mode 100644
index 00000000..7d0f3d29
--- /dev/null
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/HandlerManager.java
@@ -0,0 +1,95 @@
+/*
+ * 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 cn.hippo4j.rpc.handler;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/**
+ * Manage the Handler used in the processing.
+ * The Handler must be able to exist multiple times and be invoked once in a single execution
+ */
+public interface HandlerManager {
+
+ /**
+ * Add handler to the end of the Handler chain
+ *
+ * @param name name
+ * @param handler handler
+ */
+ HandlerManager addLast(String name, T handler);
+
+ /**
+ * Add handler to the head of the Handler chain
+ *
+ * @param name name
+ * @param handler handler
+ */
+ HandlerManager addFirst(String name, T handler);
+
+ /**
+ * Add handler to the end of the Handler chain, without specifying a name
+ *
+ * @param handler handler
+ */
+ HandlerManager addLast(T handler);
+
+ /**
+ * Adds handler to the head of the Handler chain, without specifying a name
+ *
+ * @param handler handler
+ */
+ HandlerManager addFirst(T handler);
+
+ /**
+ * Create a handler
+ *
+ * @param order order
+ * @param handler Handler
+ * @param name Handler name
+ * @return HandlerEntity
+ */
+ default HandlerEntity getHandlerEntity(long order, T handler, String name) {
+ return new HandlerEntity<>(order, handler, name);
+ }
+
+ @Data
+ @AllArgsConstructor
+ class HandlerEntity implements Comparable> {
+
+ /**
+ * order, The Handler with a larger value is executed after the Handler with a smaller value
+ */
+ long order;
+
+ /**
+ * handler
+ */
+ T handler;
+
+ /**
+ * A high level summary of handler functionality
+ */
+ String name;
+
+ @Override
+ public int compareTo(HandlerEntity o) {
+ return (int) (this.getOrder() - o.getOrder());
+ }
+ }
+}
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/handler/NettyClientPoolHandler.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/NettyClientPoolHandler.java
similarity index 55%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/handler/NettyClientPoolHandler.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/NettyClientPoolHandler.java
index bb124e81..b9e38d36 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/handler/NettyClientPoolHandler.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/NettyClientPoolHandler.java
@@ -15,22 +15,57 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.handler;
+package cn.hippo4j.rpc.handler;
-import cn.hippo4j.config.rpc.coder.NettyDecoder;
-import cn.hippo4j.config.rpc.coder.NettyEncoder;
+import cn.hippo4j.rpc.coder.NettyDecoder;
+import cn.hippo4j.rpc.coder.NettyEncoder;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
+import io.netty.channel.ChannelHandler;
import io.netty.channel.pool.ChannelPoolHandler;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.serialization.ClassResolvers;
import lombok.extern.slf4j.Slf4j;
+import java.util.List;
+
/**
* Processing by the client connection pool handler to clean the buffer and define new connection properties
*/
@Slf4j
-public class NettyClientPoolHandler implements ChannelPoolHandler {
+public class NettyClientPoolHandler extends NettyHandlerManager implements ChannelPoolHandler {
+
+ public NettyClientPoolHandler(List handlers) {
+ super(handlers);
+ }
+
+ public NettyClientPoolHandler(ChannelHandler... handlers) {
+ super(handlers);
+ }
+
+ public NettyClientPoolHandler() {
+ super();
+ }
+
+ public NettyClientPoolHandler addLast(String name, ChannelHandler handler) {
+ super.addLast(name, handler);
+ return this;
+ }
+
+ public NettyClientPoolHandler addFirst(String name, ChannelHandler handler) {
+ super.addFirst(name, handler);
+ return this;
+ }
+
+ public NettyClientPoolHandler addLast(ChannelHandler handler) {
+ super.addLast(handler);
+ return this;
+ }
+
+ public NettyClientPoolHandler addFirst(ChannelHandler handler) {
+ super.addFirst(handler);
+ return this;
+ }
@Override
public void channelReleased(Channel ch) {
@@ -50,6 +85,15 @@ public class NettyClientPoolHandler implements ChannelPoolHandler {
.setTcpNoDelay(false);
ch.pipeline().addLast(new NettyDecoder(ClassResolvers.cacheDisabled(null)));
ch.pipeline().addLast(new NettyEncoder());
- ch.pipeline().addLast(new NettyClientTakeHandler());
+ this.handlers.stream()
+ .sorted()
+ .forEach(h -> {
+ if (h.getName() == null) {
+ ch.pipeline().addLast(h.getHandler());
+ } else {
+ ch.pipeline().addLast(h.getName(), h.getHandler());
+ }
+ });
}
+
}
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/event/ConfigDataChangeEvent.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/NettyClientTakeHandler.java
similarity index 53%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/event/ConfigDataChangeEvent.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/NettyClientTakeHandler.java
index 0c3cd1e1..b2cd5d6f 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/event/ConfigDataChangeEvent.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/NettyClientTakeHandler.java
@@ -15,30 +15,29 @@
* limitations under the License.
*/
-package cn.hippo4j.config.event;
+package cn.hippo4j.rpc.handler;
-import org.springframework.util.StringUtils;
+import cn.hippo4j.common.web.exception.IllegalException;
+import cn.hippo4j.rpc.response.Response;
+import io.netty.channel.ChannelHandler;
+import io.netty.channel.ChannelHandlerContext;
/**
- * Config data change event.
+ * Interconnect with the netty mediation layer
*/
-public class ConfigDataChangeEvent extends AbstractEvent {
-
- public final String tenantId;
-
- public final String itemId;
-
- public final String tpId;
-
- public final long lastModifiedTs;
-
- public ConfigDataChangeEvent(String tenantId, String itemId, String tpId, Long gmtModified) {
- if (StringUtils.isEmpty(tenantId) || StringUtils.isEmpty(itemId) || StringUtils.isEmpty(tpId)) {
- throw new IllegalArgumentException("DataId is null or group is null");
+@ChannelHandler.Sharable
+public class NettyClientTakeHandler extends AbstractNettyTakeHandler implements ConnectHandler {
+
+ @Override
+ public void channelRead(ChannelHandlerContext ctx, Object msg) {
+ try {
+ Response response = (Response) msg;
+ handler(response);
+ ctx.flush();
+ } catch (Exception e) {
+ ctx.close();
+ throw new IllegalException(e);
}
- this.tenantId = tenantId;
- this.itemId = itemId;
- this.tpId = tpId;
- this.lastModifiedTs = gmtModified;
}
+
}
diff --git a/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/NettyHandlerManager.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/NettyHandlerManager.java
new file mode 100644
index 00000000..0649dde3
--- /dev/null
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/NettyHandlerManager.java
@@ -0,0 +1,102 @@
+/*
+ * 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 cn.hippo4j.rpc.handler;
+
+import cn.hippo4j.common.toolkit.Assert;
+import io.netty.channel.ChannelHandler;
+
+import java.util.*;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.stream.Collectors;
+
+/**
+ * Processor manager for ChannelHandler in netty
+ */
+public abstract class NettyHandlerManager implements HandlerManager {
+
+ protected final List> handlers;
+
+ AtomicLong firstIndex = new AtomicLong(-1);
+
+ AtomicLong lastIndex = new AtomicLong(0);
+
+ protected NettyHandlerManager(List handlers) {
+ this.handlers = handlers.stream()
+ .filter(Objects::nonNull)
+ .map(c -> getHandlerEntity(lastIndex.getAndIncrement(), c, null))
+ .collect(Collectors.toList());
+ }
+
+ protected NettyHandlerManager(ChannelHandler... handlers) {
+ this(handlers != null ? Arrays.asList(handlers) : Collections.emptyList());
+ }
+
+ protected NettyHandlerManager() {
+ this.handlers = new LinkedList<>();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @param name name
+ * @param handler handler
+ * @return NettyHandlerManager
+ */
+ public NettyHandlerManager addLast(String name, ChannelHandler handler) {
+ Assert.notNull(handler);
+ this.handlers.add(getHandlerEntity(lastIndex.getAndIncrement(), handler, name));
+ return this;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @param name name
+ * @param handler handler
+ * @return NettyHandlerManager
+ */
+ public NettyHandlerManager addFirst(String name, ChannelHandler handler) {
+ Assert.notNull(handler);
+ this.handlers.add(getHandlerEntity(firstIndex.getAndIncrement(), handler, name));
+ return this;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @param handler handler
+ * @return NettyHandlerManager
+ */
+ public NettyHandlerManager addLast(ChannelHandler handler) {
+ Assert.notNull(handler);
+ this.handlers.add(getHandlerEntity(lastIndex.getAndIncrement(), handler, null));
+ return this;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @param handler handler
+ * @return NettyHandlerManager
+ */
+ public NettyHandlerManager addFirst(ChannelHandler handler) {
+ Assert.notNull(handler);
+ this.handlers.add(getHandlerEntity(firstIndex.getAndDecrement(), handler, null));
+ return this;
+ }
+}
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/handler/NettyServerTakeHandler.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/NettyServerTakeHandler.java
similarity index 50%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/handler/NettyServerTakeHandler.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/NettyServerTakeHandler.java
index cac4ad6e..0bbf7b02 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/handler/NettyServerTakeHandler.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/handler/NettyServerTakeHandler.java
@@ -15,20 +15,19 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.handler;
+package cn.hippo4j.rpc.handler;
-import cn.hippo4j.config.rpc.exception.ConnectionException;
-import cn.hippo4j.config.rpc.process.ActivePostProcess;
-import cn.hippo4j.config.rpc.response.DefaultResponse;
-import cn.hippo4j.config.rpc.support.ClassRegistry;
-import cn.hippo4j.config.rpc.support.Instance;
-import cn.hippo4j.config.rpc.request.Request;
-import cn.hippo4j.config.rpc.response.Response;
import cn.hippo4j.common.toolkit.Assert;
import cn.hippo4j.common.toolkit.ReflectUtil;
-import io.netty.channel.Channel;
+import cn.hippo4j.rpc.process.ActivePostProcess;
+import cn.hippo4j.rpc.process.ActiveProcessChain;
+import cn.hippo4j.rpc.request.Request;
+import cn.hippo4j.rpc.response.DefaultResponse;
+import cn.hippo4j.rpc.response.Response;
+import cn.hippo4j.rpc.support.ClassRegistry;
+import cn.hippo4j.rpc.support.Instance;
+import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.ChannelInboundHandlerAdapter;
import java.lang.reflect.Method;
import java.util.LinkedList;
@@ -37,13 +36,14 @@ import java.util.List;
/**
* netty adaptation layer
*/
-public class NettyServerTakeHandler extends ChannelInboundHandlerAdapter implements ConnectHandler {
+@ChannelHandler.Sharable
+public class NettyServerTakeHandler extends AbstractNettyTakeHandler implements ConnectHandler {
- List processes;
+ ActiveProcessChain activeProcessChain;
Instance instance;
public NettyServerTakeHandler(List processes, Instance instance) {
- this.processes = processes;
+ this.activeProcessChain = new ActiveProcessChain(processes);
this.instance = instance;
}
@@ -57,58 +57,30 @@ public class NettyServerTakeHandler extends ChannelInboundHandlerAdapter impleme
return;
}
Request request = (Request) msg;
- Response response = handler(request);
+ Response response = sendHandler(request);
ctx.writeAndFlush(response);
}
@Override
- public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
- Channel channel = ctx.channel();
- if (channel.isActive()) {
- ctx.close();
- } else {
- throw new ConnectionException(cause);
- }
- }
-
- @Override
- public Response handler(Request request) {
- if (!preHandlers(request)) {
+ public Response sendHandler(Request request) {
+ if (!activeProcessChain.applyPreHandle(request)) {
return null;
}
+ Response response = null;
try {
Class> cls = ClassRegistry.get(request.getClassName());
Method method = ReflectUtil.getMethodByName(cls, request.getMethodName(), request.getParameterTypes());
Assert.notNull(method);
Object invoke = ReflectUtil.invoke(instance.getInstance(cls), method, request.getParameters());
- Response response = new DefaultResponse(request.getKey(), invoke.getClass(), invoke);
- postHandlers(request, response);
+ response = new DefaultResponse(request.getKey(), invoke.getClass(), invoke);
+ activeProcessChain.applyPostHandle(request, response);
return response;
} catch (Exception e) {
- Response response = new DefaultResponse(request.getKey(), e, e.getMessage());
- afterCompletions(request, response, e);
+ response = new DefaultResponse(request.getKey(), e, e.getMessage());
+ activeProcessChain.afterCompletion(request, response, e);
return response;
- }
- }
-
- private boolean preHandlers(Request request) {
- for (ActivePostProcess process : processes) {
- if (!process.preHandler(request)) {
- return false;
- }
- }
- return true;
- }
-
- private void postHandlers(Request request, Response response) {
- for (ActivePostProcess process : processes) {
- process.postHandler(request, response);
- }
- }
-
- private void afterCompletions(Request request, Response response, Exception e) {
- for (ActivePostProcess process : processes) {
- process.afterCompletion(request, response, e);
+ } finally {
+ activeProcessChain.afterCompletion(request, response, null);
}
}
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/process/ActivePostProcess.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/process/ActivePostProcess.java
similarity index 93%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/process/ActivePostProcess.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/process/ActivePostProcess.java
index 98df5998..816335f6 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/process/ActivePostProcess.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/process/ActivePostProcess.java
@@ -15,10 +15,10 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.process;
+package cn.hippo4j.rpc.process;
-import cn.hippo4j.config.rpc.request.Request;
-import cn.hippo4j.config.rpc.response.Response;
+import cn.hippo4j.rpc.request.Request;
+import cn.hippo4j.rpc.response.Response;
/**
* Callback while the connection is in progress
diff --git a/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/process/ActiveProcessChain.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/process/ActiveProcessChain.java
new file mode 100644
index 00000000..693f83ce
--- /dev/null
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/process/ActiveProcessChain.java
@@ -0,0 +1,102 @@
+/*
+ * 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 cn.hippo4j.rpc.process;
+
+import cn.hippo4j.rpc.request.Request;
+import cn.hippo4j.rpc.response.Response;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Processor chain for easier processing of processors in different scenarios
+ * reference resources: spring HandlerExecutionChain
+ *
+ * @see ActivePostProcess
+ */
+@Slf4j
+public final class ActiveProcessChain {
+
+ /**
+ * A collection of processors that will be applied to their assigned programs.
+ * Processors will perform different actions on different occasions for both the server and the client,
+ * but the execution period of that action must be the same
+ */
+ List processes;
+
+ /**
+ * index
+ * that identifies where the {@link ActivePostProcess#preHandler(Request)} processing is performed
+ * This allows for the fact that some processors will add shutable operations to the class
+ * eg: {@link java.io.Closeable}, The {@link ActivePostProcess#afterCompletion(Request, Response, Exception)}
+ * operation is not performed after an exception if the preprocessor is not executed
+ */
+ int index = -1;
+
+ public ActiveProcessChain(List processes) {
+ this.processes = processes;
+ }
+
+ public ActiveProcessChain(ActivePostProcess... processes) {
+ this((processes != null ? Arrays.asList(processes) : Collections.emptyList()));
+ }
+
+ /**
+ * Apply postHandle methods of registered processes.
+ */
+ public boolean applyPreHandle(Request request) {
+ for (int i = 0; i < this.processes.size(); i++) {
+ ActivePostProcess handle = processes.get(i);
+ if (!handle.preHandler(request)) {
+ afterCompletion(request, null, null);
+ return false;
+ }
+ this.index = i;
+ }
+ return true;
+ }
+
+ /**
+ * Apply postHandle methods of registered processes.
+ */
+ public void applyPostHandle(Request request, Response response) {
+ for (int i = processes.size() - 1; i >= 0; i--) {
+ ActivePostProcess handle = processes.get(i);
+ handle.postHandler(request, response);
+ }
+ }
+
+ /**
+ * Trigger afterCompletion callbacks on the mapped ActivePostProcess.
+ * Will just invoke afterCompletion for all interceptors whose preHandle invocation
+ * has successfully completed and returned true.
+ */
+ public void afterCompletion(Request request, Response response, Exception ex) {
+ for (int i = this.index; i >= 0; i--) {
+ ActivePostProcess handle = processes.get(i);
+ try {
+ handle.afterCompletion(request, response, ex);
+ } catch (Throwable e) {
+ log.error("HandlerInterceptor.afterCompletion threw exception", e);
+ }
+ }
+ }
+
+}
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/request/DefaultRequest.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/request/DefaultRequest.java
similarity index 96%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/request/DefaultRequest.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/request/DefaultRequest.java
index 6b82a102..a1d346fa 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/request/DefaultRequest.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/request/DefaultRequest.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.request;
+package cn.hippo4j.rpc.request;
import java.io.IOException;
import java.io.ObjectInputStream;
@@ -94,7 +94,7 @@ public final class DefaultRequest implements Request {
if (parameters == null) {
return;
}
- // 序列化属性 parameters
+ // Serialization parameters
for (Object parameter : parameters) {
s.writeObject(parameter);
}
@@ -110,7 +110,7 @@ public final class DefaultRequest implements Request {
if (parameterTypes == null) {
return;
}
- // 反序列化属性 parameters
+ // Deserialization parameters
int length = parameterTypes.length;
Object[] a = new Object[length];
for (int i = 0; i < length; i++) {
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/request/Request.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/request/Request.java
similarity index 97%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/request/Request.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/request/Request.java
index a045fbbf..db68fe3d 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/request/Request.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/request/Request.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.request;
+package cn.hippo4j.rpc.request;
import java.io.Serializable;
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/response/DefaultResponse.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/response/DefaultResponse.java
similarity index 97%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/response/DefaultResponse.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/response/DefaultResponse.java
index 408d299f..e2d38c4d 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/response/DefaultResponse.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/response/DefaultResponse.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.response;
+package cn.hippo4j.rpc.response;
import java.io.IOException;
import java.io.ObjectInputStream;
@@ -105,7 +105,7 @@ public class DefaultResponse implements Response {
if (obj == null) {
return;
}
- // 序列化属性 obj
+ // Serialization obj
s.writeObject(this.obj);
}
@@ -116,7 +116,7 @@ public class DefaultResponse implements Response {
*/
private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
s.defaultReadObject();
- // 反序列化属性 obj
+ // Deserialization obj
this.obj = s.readObject();
}
}
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/response/Response.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/response/Response.java
similarity index 97%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/response/Response.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/response/Response.java
index 3c06fbaa..cdb26e5b 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/response/Response.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/response/Response.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.response;
+package cn.hippo4j.rpc.response;
import java.io.Serializable;
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/server/NettyServerConnection.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/server/NettyServerConnection.java
similarity index 59%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/server/NettyServerConnection.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/server/NettyServerConnection.java
index cb240442..671e0748 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/server/NettyServerConnection.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/server/NettyServerConnection.java
@@ -15,14 +15,12 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.server;
+package cn.hippo4j.rpc.server;
-import cn.hippo4j.config.rpc.coder.NettyDecoder;
-import cn.hippo4j.config.rpc.coder.NettyEncoder;
-import cn.hippo4j.config.rpc.handler.NettyServerTakeHandler;
-import cn.hippo4j.config.rpc.process.ActivePostProcess;
-import cn.hippo4j.config.rpc.support.Instance;
import cn.hippo4j.common.toolkit.Assert;
+import cn.hippo4j.rpc.coder.NettyDecoder;
+import cn.hippo4j.rpc.coder.NettyEncoder;
+import cn.hippo4j.rpc.handler.NettyHandlerManager;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
@@ -31,44 +29,42 @@ import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.serialization.ClassResolvers;
import lombok.extern.slf4j.Slf4j;
-import java.util.LinkedList;
+import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
/**
* adapter to the netty server
*/
@Slf4j
-public class NettyServerConnection implements ServerConnection {
+public class NettyServerConnection extends NettyHandlerManager implements ServerConnection {
Integer port;
EventLoopGroup leader;
EventLoopGroup worker;
Class extends ServerChannel> socketChannelCls = NioServerSocketChannel.class;
- List processes;
- Instance instance;
ChannelFuture future;
+ Channel channel;
- public NettyServerConnection(EventLoopGroup leader, EventLoopGroup worker, List processes, Instance instance) {
- Assert.notNull(processes);
- Assert.notNull(instance);
+ public NettyServerConnection(EventLoopGroup leader, EventLoopGroup worker, List handlers) {
+ super(handlers);
+ Assert.notNull(handlers);
Assert.notNull(leader);
Assert.notNull(worker);
this.leader = leader;
this.worker = worker;
- this.processes = processes;
- this.instance = instance;
}
- public NettyServerConnection(EventLoopGroup leader, EventLoopGroup worker, Instance instance) {
- this(leader, worker, new LinkedList<>(), instance);
+ public NettyServerConnection(EventLoopGroup leader, EventLoopGroup worker, ChannelHandler... handlers) {
+ this(leader, worker, (handlers != null ? Arrays.asList(handlers) : Collections.emptyList()));
}
- public NettyServerConnection(List processes, Instance instance) {
- this(new NioEventLoopGroup(), new NioEventLoopGroup(), processes, instance);
+ public NettyServerConnection(ChannelHandler... handlers) {
+ this(handlers != null ? Arrays.asList(handlers) : Collections.emptyList());
}
- public NettyServerConnection(Instance instance) {
- this(new NioEventLoopGroup(), new NioEventLoopGroup(), new LinkedList<>(), instance);
+ public NettyServerConnection(List handlers) {
+ this(new NioEventLoopGroup(), new NioEventLoopGroup(), handlers);
}
@Override
@@ -83,11 +79,20 @@ public class NettyServerConnection implements ServerConnection {
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new NettyDecoder(ClassResolvers.cacheDisabled(null)));
ch.pipeline().addLast(new NettyEncoder());
- ch.pipeline().addLast(new NettyServerTakeHandler(processes, instance));
+ handlers.stream()
+ .sorted()
+ .forEach(h -> {
+ if (h.getName() == null) {
+ ch.pipeline().addLast(h.getHandler());
+ } else {
+ ch.pipeline().addLast(h.getName(), h.getHandler());
+ }
+ });
}
});
try {
this.future = server.bind(port);
+ this.channel = this.future.channel();
log.info("The server is started and can receive requests. The listening port is {}", port);
this.port = port;
this.future.channel().closeFuture().sync();
@@ -106,4 +111,29 @@ public class NettyServerConnection implements ServerConnection {
this.future.channel().close();
log.info("The server is shut down and no more requests are received. The release port is {}", port);
}
+
+ @Override
+ public boolean isActive() {
+ return channel.isActive();
+ }
+
+ public NettyServerConnection addLast(String name, ChannelHandler handler) {
+ super.addLast(name, handler);
+ return this;
+ }
+
+ public NettyServerConnection addFirst(String name, ChannelHandler handler) {
+ super.addFirst(name, handler);
+ return this;
+ }
+
+ public NettyServerConnection addLast(ChannelHandler handler) {
+ super.addLast(handler);
+ return this;
+ }
+
+ public NettyServerConnection addFirst(ChannelHandler handler) {
+ super.addFirst(handler);
+ return this;
+ }
}
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/server/RPCServer.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/server/RPCServer.java
similarity index 91%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/server/RPCServer.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/server/RPCServer.java
index b961aaf6..abb5f6ff 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/server/RPCServer.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/server/RPCServer.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.server;
+package cn.hippo4j.rpc.server;
import java.io.IOException;
@@ -37,6 +37,11 @@ public class RPCServer implements Server {
serverConnection.bind(port);
}
+ @Override
+ public boolean isActive() {
+ return serverConnection.isActive();
+ }
+
/**
* Shut down the server and release the port
*/
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/server/Server.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/server/Server.java
similarity index 88%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/server/Server.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/server/Server.java
index 69056286..9c21f788 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/server/Server.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/server/Server.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.server;
+package cn.hippo4j.rpc.server;
import java.io.Closeable;
@@ -30,4 +30,11 @@ public interface Server extends Closeable {
*/
void bind();
+ /**
+ * Check whether the server is active
+ *
+ * @return Whether active
+ */
+ boolean isActive();
+
}
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/server/ServerConnection.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/server/ServerConnection.java
similarity index 91%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/server/ServerConnection.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/server/ServerConnection.java
index 1e1d8a4b..fcb5a9e1 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/server/ServerConnection.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/server/ServerConnection.java
@@ -15,9 +15,9 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.server;
+package cn.hippo4j.rpc.server;
-import cn.hippo4j.config.rpc.handler.Connection;
+import cn.hippo4j.rpc.handler.Connection;
/**
* This applies to server-side connections
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/ClassRegistry.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/ClassRegistry.java
similarity index 98%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/ClassRegistry.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/ClassRegistry.java
index 4b938550..ebcc86f6 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/ClassRegistry.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/ClassRegistry.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.support;
+package cn.hippo4j.rpc.support;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/DefaultInstance.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/DefaultInstance.java
similarity index 97%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/DefaultInstance.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/DefaultInstance.java
index 1c5ec559..c6cf9a6c 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/DefaultInstance.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/DefaultInstance.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.support;
+package cn.hippo4j.rpc.support;
import cn.hippo4j.common.toolkit.ReflectUtil;
import cn.hippo4j.common.web.exception.IllegalException;
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/Instance.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/Instance.java
similarity index 97%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/Instance.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/Instance.java
index e1b7f33a..840dff3a 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/Instance.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/Instance.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.support;
+package cn.hippo4j.rpc.support;
/**
* Instance interface to get an instance
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/NettyConnectPool.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/NettyConnectPool.java
similarity index 93%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/NettyConnectPool.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/NettyConnectPool.java
index 4268ba4c..a34159e9 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/NettyConnectPool.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/NettyConnectPool.java
@@ -15,10 +15,9 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.support;
+package cn.hippo4j.rpc.support;
-import cn.hippo4j.config.rpc.exception.ConnectionException;
-import cn.hippo4j.config.rpc.handler.NettyClientPoolHandler;
+import cn.hippo4j.rpc.exception.ConnectionException;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.EventLoopGroup;
@@ -41,14 +40,15 @@ public class NettyConnectPool {
ChannelHealthChecker healthCheck = ChannelHealthChecker.ACTIVE;
FixedChannelPool.AcquireTimeoutAction acquireTimeoutAction = FixedChannelPool.AcquireTimeoutAction.NEW;
int maxPendingAcquires = Integer.MAX_VALUE;
- ChannelPoolHandler handler = new NettyClientPoolHandler();
+ ChannelPoolHandler handler;
ChannelPool pool;
String host;
int port;
public NettyConnectPool(String host, int port, int maxConnect,
long timeout, EventLoopGroup worker,
- Class extends Channel> socketChannelCls) {
+ Class extends Channel> socketChannelCls,
+ ChannelPoolHandler handler) {
InetSocketAddress socketAddress = InetSocketAddress.createUnresolved(host, port);
Bootstrap bootstrap = new Bootstrap()
.group(worker)
@@ -56,6 +56,7 @@ public class NettyConnectPool {
.remoteAddress(socketAddress);
this.host = host;
this.port = port;
+ this.handler = handler;
this.pool = new FixedChannelPool(bootstrap, handler, healthCheck, acquireTimeoutAction,
timeout, maxConnect, maxPendingAcquires, true, true);
log.info("The connection pool is established with the connection target {}:{}", host, port);
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/NettyConnectPoolHolder.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/NettyConnectPoolHolder.java
similarity index 81%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/NettyConnectPoolHolder.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/NettyConnectPoolHolder.java
index d7cb7b86..e143948f 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/NettyConnectPoolHolder.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/NettyConnectPoolHolder.java
@@ -15,10 +15,11 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.support;
+package cn.hippo4j.rpc.support;
import io.netty.channel.Channel;
import io.netty.channel.EventLoopGroup;
+import io.netty.channel.pool.ChannelPoolHandler;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.util.concurrent.EventExecutorGroup;
import lombok.AccessLevel;
@@ -38,11 +39,13 @@ public class NettyConnectPoolHolder {
static Map connectPoolMap = new ConcurrentHashMap<>();
private static NettyConnectPool initPool(String host, int port,
- long timeout, EventLoopGroup worker) {
+ long timeout, EventLoopGroup worker,
+ ChannelPoolHandler handler) {
return new NettyConnectPool(
host, port, maxConnect,
timeout, worker,
- NioSocketChannel.class);
+ NioSocketChannel.class,
+ handler);
}
private static String getKey(String host, int port) {
@@ -75,21 +78,22 @@ public class NettyConnectPoolHolder {
/**
* Gets a connection pool, and if there is no connectPoolMapping, creates one with the values provided and joins the connectPoolMapping
*
- * @param host the host
- * @param port the port
- * @param timeout timeout
- * @param worker Special {@link EventExecutorGroup} which allows registering {@link Channel}s
- * that get processed for later selection during the event loop.
+ * @param host the host
+ * @param port the port
+ * @param timeout timeout
+ * @param worker Special {@link EventExecutorGroup} which allows registering {@link Channel}s
+ * that get processed for later selection during the event loop.
+ * @param handler the chandler for netty
* @return Map to the connection pool
*/
public static synchronized NettyConnectPool getPool(String host, int port,
- long timeout, EventLoopGroup worker) {
+ long timeout, EventLoopGroup worker,
+ ChannelPoolHandler handler) {
/*
- * this cannot use the computeIfAbsent method directly here because put is already used in init.
- * Details refer to https://bugs.openjdk.java.net/browse/JDK-8062841
+ * this cannot use the computeIfAbsent method directly here because put is already used in init. Details refer to https://bugs.openjdk.java.net/browse/JDK-8062841
*/
NettyConnectPool pool = getPool(host, port);
- return pool == null ? initPool(host, port, timeout, worker) : pool;
+ return pool == null ? initPool(host, port, timeout, worker, handler) : pool;
}
/**
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/NettyProxyCenter.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/NettyProxyCenter.java
similarity index 82%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/NettyProxyCenter.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/NettyProxyCenter.java
index 6ba1dcf6..e73ef944 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/NettyProxyCenter.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/NettyProxyCenter.java
@@ -15,14 +15,15 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.support;
+package cn.hippo4j.rpc.support;
-import cn.hippo4j.config.rpc.request.DefaultRequest;
-import cn.hippo4j.config.rpc.client.NettyClientConnection;
-import cn.hippo4j.config.rpc.request.Request;
-import cn.hippo4j.config.rpc.response.Response;
import cn.hippo4j.common.toolkit.IdUtil;
import cn.hippo4j.common.web.exception.IllegalException;
+import cn.hippo4j.rpc.client.NettyClientConnection;
+import cn.hippo4j.rpc.request.DefaultRequest;
+import cn.hippo4j.rpc.request.Request;
+import cn.hippo4j.rpc.response.Response;
+import io.netty.channel.pool.ChannelPoolHandler;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
@@ -41,16 +42,17 @@ public class NettyProxyCenter {
static Map, Object> map = new HashMap<>();
/**
- * 通过一个接口得到一个适用于PRC的代理对象
+ * A proxy object for PRC is obtained through an interface
*
- * @param cls 接口类型
- * @param host 请求地址
- * @param port 端口
- * @param 对象类型
- * @return 代理对象
+ * @param cls The interface type
+ * @param host Request the address
+ * @param port port
+ * @param Object type
+ * @param handler the pool handler for netty
+ * @return Proxy objects
*/
- public static T getProxy(Class cls, String host, int port) {
- NettyClientConnection connection = new NettyClientConnection(host, port);
+ public static T getProxy(Class cls, String host, int port, ChannelPoolHandler handler) {
+ NettyClientConnection connection = new NettyClientConnection(host, port, handler);
return getProxy(connection, cls, host, port);
}
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/ResultHolder.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/ResultHolder.java
similarity index 96%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/ResultHolder.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/ResultHolder.java
index 2220fe8e..141368c3 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/ResultHolder.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/ResultHolder.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.support;
+package cn.hippo4j.rpc.support;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
@@ -56,7 +56,7 @@ public class ResultHolder {
* @param key Request and response keys
* @param t The Thread
*/
- public static void put(String key, Thread t) {
+ public static void putThread(String key, Thread t) {
log.debug("Write thread, waiting to wake up");
threadMap.put(key, t);
}
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/SpringContextInstance.java b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/SpringContextInstance.java
similarity index 96%
rename from hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/SpringContextInstance.java
rename to hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/SpringContextInstance.java
index 9bd6ec56..a0d2db7a 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/rpc/support/SpringContextInstance.java
+++ b/hippo4j-rpc/src/main/java/cn/hippo4j/rpc/support/SpringContextInstance.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.support;
+package cn.hippo4j.rpc.support;
import cn.hippo4j.common.config.ApplicationContextHolder;
diff --git a/hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/client/CallManager.java b/hippo4j-rpc/src/test/java/cn/hippo4j/rpc/client/CallManager.java
similarity index 89%
rename from hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/client/CallManager.java
rename to hippo4j-rpc/src/test/java/cn/hippo4j/rpc/client/CallManager.java
index d3fae3ae..6ad49004 100644
--- a/hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/client/CallManager.java
+++ b/hippo4j-rpc/src/test/java/cn/hippo4j/rpc/client/CallManager.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.client;
+package cn.hippo4j.rpc.client;
public class CallManager {
@@ -23,4 +23,8 @@ public class CallManager {
return 1;
}
+ public int callTest(Integer a, Integer b) {
+ return a + b;
+ }
+
}
diff --git a/hippo4j-rpc/src/test/java/cn/hippo4j/rpc/client/RPCClientTest.java b/hippo4j-rpc/src/test/java/cn/hippo4j/rpc/client/RPCClientTest.java
new file mode 100644
index 00000000..3db8311e
--- /dev/null
+++ b/hippo4j-rpc/src/test/java/cn/hippo4j/rpc/client/RPCClientTest.java
@@ -0,0 +1,112 @@
+/*
+ * 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 cn.hippo4j.rpc.client;
+
+import cn.hippo4j.rpc.handler.NettyClientPoolHandler;
+import cn.hippo4j.rpc.handler.NettyClientTakeHandler;
+import cn.hippo4j.rpc.handler.NettyServerTakeHandler;
+import cn.hippo4j.rpc.request.DefaultRequest;
+import cn.hippo4j.rpc.request.Request;
+import cn.hippo4j.rpc.response.Response;
+import cn.hippo4j.rpc.server.NettyServerConnection;
+import cn.hippo4j.rpc.server.RPCServer;
+import cn.hippo4j.rpc.server.ServerConnection;
+import cn.hippo4j.rpc.support.ClassRegistry;
+import cn.hippo4j.rpc.support.DefaultInstance;
+import cn.hippo4j.rpc.support.Instance;
+import io.netty.channel.pool.ChannelPoolHandler;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+
+public class RPCClientTest {
+
+ String host = "localhost";
+ int port = 8888;
+ int portTest = 8889;
+
+ @Test
+ public void connection() throws IOException {
+ Class cls = CallManager.class;
+ String className = cls.getName();
+ ClassRegistry.put(className, cls);
+ // The mode connection was denied when the server was started on the specified port
+ Instance instance = new DefaultInstance();
+ NettyServerTakeHandler handler = new NettyServerTakeHandler(instance);
+ ServerConnection connection = new NettyServerConnection(handler);
+ RPCServer rpcServer = new RPCServer(port, connection);
+ CompletableFuture.runAsync(rpcServer::bind);
+ try {
+ TimeUnit.SECONDS.sleep(3);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ ChannelPoolHandler channelPoolHandler = new NettyClientPoolHandler(new NettyClientTakeHandler());
+ NettyClientConnection clientConnection = new NettyClientConnection(host, port, channelPoolHandler);
+ RPCClient rpcClient = new RPCClient(clientConnection);
+ Request request = new DefaultRequest("127.0.0.18888", className, "call", null, null);
+ for (int i = 0; i < 100; i++) {
+ Response response = rpcClient.connection(request);
+ boolean active = rpcClient.isActive();
+ Assert.assertTrue(active);
+ Assert.assertEquals(response.getObj(), 1);
+ }
+ rpcClient.close();
+ rpcServer.close();
+ }
+
+ /**
+ * This test case can be overridden under the handler and coder packages
+ */
+ @Test
+ public void connectionTest() throws IOException {
+ Class cls = CallManager.class;
+ String className = cls.getName();
+ ClassRegistry.put(className, cls);
+ // The mode connection was denied when the server was started on the specified port
+ Instance instance = new DefaultInstance();
+ NettyServerTakeHandler handler = new NettyServerTakeHandler(instance);
+ ServerConnection connection = new NettyServerConnection(handler);
+ RPCServer rpcServer = new RPCServer(portTest, connection);
+ CompletableFuture.runAsync(rpcServer::bind);
+ try {
+ TimeUnit.SECONDS.sleep(3);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ ChannelPoolHandler channelPoolHandler = new NettyClientPoolHandler(new NettyClientTakeHandler());
+ NettyClientConnection clientConnection = new NettyClientConnection(host, portTest, channelPoolHandler);
+ RPCClient rpcClient = new RPCClient(clientConnection);
+ Class>[] classes = new Class>[2];
+ classes[0] = Integer.class;
+ classes[1] = Integer.class;
+ Object[] objects = new Object[2];
+ objects[0] = 1;
+ objects[1] = 2;
+ Request request = new DefaultRequest("127.0.0.18889", className, "callTest", classes, objects);
+ Response response = rpcClient.connection(request);
+ boolean active = rpcClient.isActive();
+ Assert.assertTrue(active);
+ Assert.assertEquals(response.getObj(), 3);
+ rpcClient.close();
+ rpcServer.close();
+ }
+}
\ No newline at end of file
diff --git a/hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/server/RPCServerTest.java b/hippo4j-rpc/src/test/java/cn/hippo4j/rpc/server/RPCServerTest.java
similarity index 79%
rename from hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/server/RPCServerTest.java
rename to hippo4j-rpc/src/test/java/cn/hippo4j/rpc/server/RPCServerTest.java
index 726ca910..5d06b9f8 100644
--- a/hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/server/RPCServerTest.java
+++ b/hippo4j-rpc/src/test/java/cn/hippo4j/rpc/server/RPCServerTest.java
@@ -15,12 +15,14 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.server;
+package cn.hippo4j.rpc.server;
-import cn.hippo4j.config.rpc.support.DefaultInstance;
-import cn.hippo4j.config.rpc.support.Instance;
+import cn.hippo4j.rpc.handler.NettyServerTakeHandler;
+import cn.hippo4j.rpc.support.DefaultInstance;
+import cn.hippo4j.rpc.support.Instance;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
+import org.junit.Assert;
import org.junit.Test;
import java.io.IOException;
@@ -34,7 +36,8 @@ public class RPCServerTest {
@Test
public void bind() throws IOException {
Instance instance = new DefaultInstance();
- ServerConnection connection = new NettyServerConnection(instance);
+ NettyServerTakeHandler handler = new NettyServerTakeHandler(instance);
+ ServerConnection connection = new NettyServerConnection(handler);
RPCServer rpcServer = new RPCServer(port, connection);
CompletableFuture.runAsync(rpcServer::bind);
try {
@@ -42,7 +45,11 @@ public class RPCServerTest {
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
+ boolean active = rpcServer.isActive();
+ Assert.assertTrue(active);
rpcServer.close();
+ boolean serverActive = rpcServer.isActive();
+ Assert.assertFalse(serverActive);
}
@Test
@@ -50,7 +57,8 @@ public class RPCServerTest {
Instance instance = new DefaultInstance();
EventLoopGroup leader = new NioEventLoopGroup();
EventLoopGroup worker = new NioEventLoopGroup();
- ServerConnection connection = new NettyServerConnection(leader, worker, instance);
+ NettyServerTakeHandler handler = new NettyServerTakeHandler(instance);
+ ServerConnection connection = new NettyServerConnection(leader, worker, handler);
RPCServer rpcServer = new RPCServer(port, connection);
CompletableFuture.runAsync(rpcServer::bind);
try {
diff --git a/hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/support/ClassRegistryTest.java b/hippo4j-rpc/src/test/java/cn/hippo4j/rpc/support/ClassRegistryTest.java
similarity index 98%
rename from hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/support/ClassRegistryTest.java
rename to hippo4j-rpc/src/test/java/cn/hippo4j/rpc/support/ClassRegistryTest.java
index 403a7114..80fa3a53 100644
--- a/hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/support/ClassRegistryTest.java
+++ b/hippo4j-rpc/src/test/java/cn/hippo4j/rpc/support/ClassRegistryTest.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.support;
+package cn.hippo4j.rpc.support;
import org.junit.Assert;
import org.junit.Test;
diff --git a/hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/support/DefaultInstanceTest.java b/hippo4j-rpc/src/test/java/cn/hippo4j/rpc/support/DefaultInstanceTest.java
similarity index 92%
rename from hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/support/DefaultInstanceTest.java
rename to hippo4j-rpc/src/test/java/cn/hippo4j/rpc/support/DefaultInstanceTest.java
index 6d070446..aa6dca00 100644
--- a/hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/support/DefaultInstanceTest.java
+++ b/hippo4j-rpc/src/test/java/cn/hippo4j/rpc/support/DefaultInstanceTest.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.support;
+package cn.hippo4j.rpc.support;
import lombok.AllArgsConstructor;
import lombok.Getter;
@@ -38,7 +38,7 @@ public class DefaultInstanceTest {
@Test
public void testGetInstance() {
- String className = "cn.hippo4j.config.rpc.support.DefaultInstanceTest$InstanceModel";
+ String className = "cn.hippo4j.rpc.support.DefaultInstanceTest$InstanceModel";
Object instanceInstance = instance.getInstance(className);
Assert.assertNotNull(instanceInstance);
Assert.assertEquals(className, instanceInstance.getClass().getName());
diff --git a/hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/support/NettyConnectPoolHolderTest.java b/hippo4j-rpc/src/test/java/cn/hippo4j/rpc/support/NettyConnectPoolHolderTest.java
similarity index 81%
rename from hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/support/NettyConnectPoolHolderTest.java
rename to hippo4j-rpc/src/test/java/cn/hippo4j/rpc/support/NettyConnectPoolHolderTest.java
index f510ecd5..ce68b9a0 100644
--- a/hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/support/NettyConnectPoolHolderTest.java
+++ b/hippo4j-rpc/src/test/java/cn/hippo4j/rpc/support/NettyConnectPoolHolderTest.java
@@ -15,8 +15,10 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.support;
+package cn.hippo4j.rpc.support;
+import cn.hippo4j.rpc.handler.NettyClientPoolHandler;
+import cn.hippo4j.rpc.handler.NettyClientTakeHandler;
import io.netty.channel.Channel;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
@@ -35,7 +37,8 @@ public class NettyConnectPoolHolderTest {
@Test
public void createPool() {
- NettyConnectPool pool = new NettyConnectPool(host, port, maxCount, timeout, group, cls);
+ NettyClientPoolHandler handler = new NettyClientPoolHandler(new NettyClientTakeHandler());
+ NettyConnectPool pool = new NettyConnectPool(host, port, maxCount, timeout, group, cls, handler);
NettyConnectPool connectPool = NettyConnectPoolHolder.getPool(host, port);
Assert.assertEquals(pool, connectPool);
NettyConnectPoolHolder.clear();
@@ -45,7 +48,8 @@ public class NettyConnectPoolHolderTest {
@Test
public void testGetPool() {
- NettyConnectPool connectPool = NettyConnectPoolHolder.getPool(host, port, timeout, group);
+ NettyClientPoolHandler handler = new NettyClientPoolHandler(new NettyClientTakeHandler());
+ NettyConnectPool connectPool = NettyConnectPoolHolder.getPool(host, port, timeout, group, handler);
NettyConnectPool connectPool1 = NettyConnectPoolHolder.getPool(host, port);
Assert.assertEquals(connectPool1, connectPool);
NettyConnectPoolHolder.clear();
@@ -55,7 +59,8 @@ public class NettyConnectPoolHolderTest {
@Test
public void remove() {
- NettyConnectPool connectPool = NettyConnectPoolHolder.getPool(host, port, timeout, group);
+ NettyClientPoolHandler handler = new NettyClientPoolHandler(new NettyClientTakeHandler());
+ NettyConnectPool connectPool = NettyConnectPoolHolder.getPool(host, port, timeout, group, handler);
NettyConnectPool connectPool1 = NettyConnectPoolHolder.getPool(host, port);
Assert.assertEquals(connectPool1, connectPool);
NettyConnectPoolHolder.remove(host, port);
diff --git a/hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/support/NettyConnectPoolTest.java b/hippo4j-rpc/src/test/java/cn/hippo4j/rpc/support/NettyConnectPoolTest.java
similarity index 78%
rename from hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/support/NettyConnectPoolTest.java
rename to hippo4j-rpc/src/test/java/cn/hippo4j/rpc/support/NettyConnectPoolTest.java
index 622e575d..fd8457a4 100644
--- a/hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/support/NettyConnectPoolTest.java
+++ b/hippo4j-rpc/src/test/java/cn/hippo4j/rpc/support/NettyConnectPoolTest.java
@@ -15,11 +15,14 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.support;
+package cn.hippo4j.rpc.support;
-import cn.hippo4j.config.rpc.server.NettyServerConnection;
-import cn.hippo4j.config.rpc.server.RPCServer;
-import cn.hippo4j.config.rpc.server.ServerConnection;
+import cn.hippo4j.rpc.handler.NettyClientPoolHandler;
+import cn.hippo4j.rpc.handler.NettyClientTakeHandler;
+import cn.hippo4j.rpc.handler.NettyServerTakeHandler;
+import cn.hippo4j.rpc.server.NettyServerConnection;
+import cn.hippo4j.rpc.server.RPCServer;
+import cn.hippo4j.rpc.server.ServerConnection;
import io.netty.channel.Channel;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
@@ -45,7 +48,8 @@ public class NettyConnectPoolTest {
public void acquire() throws IOException {
// The mode connection was denied when the server was started on the specified port
Instance instance = new DefaultInstance();
- ServerConnection connection = new NettyServerConnection(instance);
+ NettyServerTakeHandler handler = new NettyServerTakeHandler(instance);
+ ServerConnection connection = new NettyServerConnection(handler);
RPCServer rpcServer = new RPCServer(port, connection);
CompletableFuture.runAsync(rpcServer::bind);
// Given the delay in starting the server, wait here
@@ -54,8 +58,8 @@ public class NettyConnectPoolTest {
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
-
- NettyConnectPool pool = new NettyConnectPool(host, port, maxCount, timeout, group, cls);
+ NettyClientPoolHandler poolHandler = new NettyClientPoolHandler(new NettyClientTakeHandler());
+ NettyConnectPool pool = new NettyConnectPool(host, port, maxCount, timeout, group, cls, poolHandler);
Channel acquire = pool.acquire(timeout);
Assert.assertNotNull(acquire);
pool.release(acquire);
@@ -66,7 +70,8 @@ public class NettyConnectPoolTest {
public void testAcquire() throws IOException {
// The mode connection was denied when the server was started on the specified port
Instance instance = new DefaultInstance();
- ServerConnection connection = new NettyServerConnection(instance);
+ NettyServerTakeHandler handler = new NettyServerTakeHandler(instance);
+ ServerConnection connection = new NettyServerConnection(handler);
RPCServer rpcServer = new RPCServer(port, connection);
CompletableFuture.runAsync(rpcServer::bind);
// Given the delay in starting the server, wait here
@@ -75,8 +80,8 @@ public class NettyConnectPoolTest {
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
-
- NettyConnectPool pool = new NettyConnectPool(host, port, maxCount, timeout, group, cls);
+ NettyClientPoolHandler poolHandler = new NettyClientPoolHandler(new NettyClientTakeHandler());
+ NettyConnectPool pool = new NettyConnectPool(host, port, maxCount, timeout, group, cls, poolHandler);
Future acquire = pool.acquire();
Assert.assertNotNull(acquire);
rpcServer.close();
@@ -86,7 +91,8 @@ public class NettyConnectPoolTest {
public void close() throws IOException {
// The mode connection was denied when the server was started on the specified port
Instance instance = new DefaultInstance();
- ServerConnection connection = new NettyServerConnection(instance);
+ NettyServerTakeHandler handler = new NettyServerTakeHandler(instance);
+ ServerConnection connection = new NettyServerConnection(handler);
RPCServer rpcServer = new RPCServer(port, connection);
CompletableFuture.runAsync(rpcServer::bind);
// Given the delay in starting the server, wait here
@@ -96,7 +102,8 @@ public class NettyConnectPoolTest {
throw new RuntimeException(e);
}
- NettyConnectPool pool = new NettyConnectPool(host, port, maxCount, timeout, group, cls);
+ NettyClientPoolHandler poolHandler = new NettyClientPoolHandler(new NettyClientTakeHandler());
+ NettyConnectPool pool = new NettyConnectPool(host, port, maxCount, timeout, group, cls, poolHandler);
Channel acquire = pool.acquire(timeout);
Assert.assertNotNull(acquire);
pool.release(acquire);
diff --git a/hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/support/NettyProxyCenterTest.java b/hippo4j-rpc/src/test/java/cn/hippo4j/rpc/support/NettyProxyCenterTest.java
similarity index 60%
rename from hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/support/NettyProxyCenterTest.java
rename to hippo4j-rpc/src/test/java/cn/hippo4j/rpc/support/NettyProxyCenterTest.java
index 9ae4ac50..41d2de53 100644
--- a/hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/support/NettyProxyCenterTest.java
+++ b/hippo4j-rpc/src/test/java/cn/hippo4j/rpc/support/NettyProxyCenterTest.java
@@ -15,9 +15,12 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.support;
+package cn.hippo4j.rpc.support;
import cn.hippo4j.common.web.exception.IllegalException;
+import cn.hippo4j.rpc.exception.ConnectionException;
+import cn.hippo4j.rpc.handler.NettyClientPoolHandler;
+import cn.hippo4j.rpc.handler.NettyClientTakeHandler;
import org.junit.Assert;
import org.junit.Test;
@@ -25,17 +28,29 @@ public class NettyProxyCenterTest {
@Test
public void getProxy() {
- ProxyInterface localhost = NettyProxyCenter.getProxy(ProxyInterface.class, "localhost", 8888);
+ NettyClientPoolHandler handler = new NettyClientPoolHandler(new NettyClientTakeHandler());
+ ProxyInterface localhost = NettyProxyCenter.getProxy(ProxyInterface.class, "localhost", 8888, handler);
Assert.assertNotNull(localhost);
}
@Test(expected = IllegalException.class)
public void getProxyTest() {
- ProxyClass localhost = NettyProxyCenter.getProxy(ProxyClass.class, "localhost", 8888);
+ NettyClientPoolHandler handler = new NettyClientPoolHandler(new NettyClientTakeHandler());
+ ProxyClass localhost = NettyProxyCenter.getProxy(ProxyClass.class, "localhost", 8888, handler);
Assert.assertNotNull(localhost);
}
+
+ @Test(expected = ConnectionException.class)
+ public void getProxyTestCall() {
+ NettyClientPoolHandler handler = new NettyClientPoolHandler(new NettyClientTakeHandler());
+ ProxyInterface localhost = NettyProxyCenter.getProxy(ProxyInterface.class, "localhost", 8888, handler);
+ localhost.hello();
+ Assert.assertNotNull(localhost);
+ }
+
interface ProxyInterface {
+ void hello();
}
static class ProxyClass {
diff --git a/hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/support/ResultHolderTest.java b/hippo4j-rpc/src/test/java/cn/hippo4j/rpc/support/ResultHolderTest.java
similarity index 63%
rename from hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/support/ResultHolderTest.java
rename to hippo4j-rpc/src/test/java/cn/hippo4j/rpc/support/ResultHolderTest.java
index 3defaf3b..4302a335 100644
--- a/hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/support/ResultHolderTest.java
+++ b/hippo4j-rpc/src/test/java/cn/hippo4j/rpc/support/ResultHolderTest.java
@@ -15,12 +15,17 @@
* limitations under the License.
*/
-package cn.hippo4j.config.rpc.support;
+package cn.hippo4j.rpc.support;
import cn.hippo4j.common.toolkit.IdUtil;
import org.junit.Assert;
import org.junit.Test;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.locks.LockSupport;
+
public class ResultHolderTest {
@Test
@@ -39,4 +44,21 @@ public class ResultHolderTest {
Assert.assertEquals(r1, o1);
Assert.assertEquals(r2, o2);
}
+
+ @Test
+ public void testThread() throws InterruptedException {
+ AtomicInteger a = new AtomicInteger();
+ String s1 = IdUtil.simpleUUID();
+ String o1 = s1 + "1";
+ CompletableFuture.runAsync(() -> {
+ ResultHolder.putThread(o1, Thread.currentThread());
+ LockSupport.park();
+ a.set(1);
+ });
+ Assert.assertEquals(0, a.get());
+ TimeUnit.SECONDS.sleep(1);
+ ResultHolder.wake(o1);
+ TimeUnit.SECONDS.sleep(1);
+ Assert.assertEquals(1, a.get());
+ }
}
\ No newline at end of file
diff --git a/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/config/FilterConfig.java b/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/config/FilterConfig.java
index 76aa3602..ae53a759 100644
--- a/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/config/FilterConfig.java
+++ b/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/config/FilterConfig.java
@@ -23,7 +23,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
- *
+ * Filter config.
*/
@Configuration
public class FilterConfig {
diff --git a/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/filter/JWTAuthorizationFilter.java b/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/filter/JWTAuthorizationFilter.java
index 3b6cf69e..78f3bee5 100644
--- a/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/filter/JWTAuthorizationFilter.java
+++ b/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/filter/JWTAuthorizationFilter.java
@@ -68,14 +68,12 @@ public class JWTAuthorizationFilter extends BasicAuthenticationFilter {
chain.doFilter(request, response);
return;
}
-
// If there is no Authorization information in the request header, it will be released directly.
String tokenHeader = request.getHeader(JwtTokenUtil.TOKEN_HEADER);
if (tokenHeader == null || !tokenHeader.startsWith(JwtTokenUtil.TOKEN_PREFIX)) {
chain.doFilter(request, response);
return;
}
-
// If there is a Token in the request header, it is parsed and the authentication information is set.
try {
SecurityContextHolder.getContext().setAuthentication(getAuthentication(tokenHeader));
diff --git a/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/security/JwtTokenManager.java b/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/security/JwtTokenManager.java
index 17f52aaa..2abd58d6 100644
--- a/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/security/JwtTokenManager.java
+++ b/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/security/JwtTokenManager.java
@@ -41,15 +41,30 @@ import static cn.hippo4j.common.constant.Constants.AUTHORITIES_KEY;
@Component
public class JwtTokenManager {
+ /**
+ * Create token.
+ *
+ * @param userName user-name
+ * @return new token
+ */
public String createToken(String userName) {
long now = System.currentTimeMillis();
Date validity;
validity = new Date(now + TOKEN_VALIDITY_IN_SECONDS * 1000L);
Claims claims = Jwts.claims().setSubject(userName);
- return Jwts.builder().setClaims(claims).setExpiration(validity)
- .signWith(SignatureAlgorithm.HS512, SECRET).compact();
+ String token = Jwts.builder()
+ .setClaims(claims)
+ .setExpiration(validity)
+ .signWith(SignatureAlgorithm.HS512, SECRET)
+ .compact();
+ return token;
}
+ /**
+ * Validate token.
+ *
+ * @param token token
+ */
public void validateToken(String token) {
Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token);
}
diff --git a/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/service/impl/UserServiceImpl.java b/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/service/impl/UserServiceImpl.java
index b500fa06..c2cf1988 100644
--- a/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/service/impl/UserServiceImpl.java
+++ b/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/service/impl/UserServiceImpl.java
@@ -22,7 +22,6 @@ import cn.hippo4j.auth.model.UserInfo;
import cn.hippo4j.auth.model.biz.user.UserQueryPageReqDTO;
import cn.hippo4j.auth.model.biz.user.UserReqDTO;
import cn.hippo4j.auth.model.biz.user.UserRespDTO;
-import cn.hippo4j.auth.service.RoleService;
import cn.hippo4j.auth.service.UserService;
import cn.hippo4j.common.toolkit.BeanUtil;
import cn.hippo4j.common.toolkit.StringUtil;
@@ -49,8 +48,6 @@ public class UserServiceImpl implements UserService {
private final UserMapper userMapper;
- private final RoleService roleService;
-
private final BCryptPasswordEncoder bCryptPasswordEncoder;
@Override
diff --git a/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/toolkit/JwtTokenUtil.java b/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/toolkit/JwtTokenUtil.java
index c78af646..40a831c0 100644
--- a/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/toolkit/JwtTokenUtil.java
+++ b/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/toolkit/JwtTokenUtil.java
@@ -36,9 +36,11 @@ import static cn.hippo4j.common.constant.Constants.MAP_INITIAL_CAPACITY;
public class JwtTokenUtil {
public static final String TOKEN_HEADER = "Authorization";
+
public static final String TOKEN_PREFIX = "Bearer ";
public static final String SECRET = "SecretKey039245678901232039487623456783092349288901402967890140939827";
+
public static final String ISS = "admin";
/**
diff --git a/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/toolkit/ReturnT.java b/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/toolkit/ReturnT.java
index ccc1ab1c..47743239 100644
--- a/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/toolkit/ReturnT.java
+++ b/hippo4j-server/hippo4j-auth/src/main/java/cn/hippo4j/auth/toolkit/ReturnT.java
@@ -32,13 +32,17 @@ public class ReturnT implements Serializable {
public static final long serialVersionUID = 42L;
public static final int SUCCESS_CODE = 200;
+
public static final int FAIL_CODE = 500;
public static final ReturnT SUCCESS = new ReturnT<>(null);
+
public static final ReturnT FAIL = new ReturnT<>(FAIL_CODE, null);
private int code;
+
private String msg;
+
private T content;
public ReturnT(int code, String msg) {
diff --git a/hippo4j-server/hippo4j-bootstrap/src/main/java/cn/hippo4j/server/ServerApplication.java b/hippo4j-server/hippo4j-bootstrap/src/main/java/cn/hippo4j/server/ServerApplication.java
index 239a632f..e235e69a 100644
--- a/hippo4j-server/hippo4j-bootstrap/src/main/java/cn/hippo4j/server/ServerApplication.java
+++ b/hippo4j-server/hippo4j-bootstrap/src/main/java/cn/hippo4j/server/ServerApplication.java
@@ -22,6 +22,9 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;
+/**
+ * ServerApplication
+ */
@EnableTransactionManagement
@SpringBootApplication(scanBasePackages = "cn.hippo4j")
@MapperScan(basePackages = {"cn.hippo4j.config.mapper", "cn.hippo4j.auth.mapper"})
diff --git a/hippo4j-server/hippo4j-bootstrap/src/main/java/cn/hippo4j/server/init/LocalDataSourceLoader.java b/hippo4j-server/hippo4j-bootstrap/src/main/java/cn/hippo4j/server/init/LocalDataSourceLoader.java
index ae59559b..6cba358f 100644
--- a/hippo4j-server/hippo4j-bootstrap/src/main/java/cn/hippo4j/server/init/LocalDataSourceLoader.java
+++ b/hippo4j-server/hippo4j-bootstrap/src/main/java/cn/hippo4j/server/init/LocalDataSourceLoader.java
@@ -35,7 +35,8 @@ import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.StandardCharsets;
-import java.sql.*;
+import java.sql.Connection;
+import java.sql.DriverManager;
import java.util.Objects;
/**
diff --git a/hippo4j-server/hippo4j-config/pom.xml b/hippo4j-server/hippo4j-config/pom.xml
index b4ec93d8..f548e2cc 100644
--- a/hippo4j-server/hippo4j-config/pom.xml
+++ b/hippo4j-server/hippo4j-config/pom.xml
@@ -11,7 +11,6 @@
true
- 2.1.214
@@ -50,6 +49,7 @@
cn.hippo4jhippo4j-adapter-base
+ ${revision}cn.hippo4j
@@ -63,6 +63,7 @@
org.hibernate.validatorhibernate-validator
+ ${hibernate-validator.version}org.springframework.boot
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/monitor/AbstractMonitorDataExecuteStrategy.java b/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/monitor/AbstractMonitorDataExecuteStrategy.java
index ae0dc032..78d89bcf 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/monitor/AbstractMonitorDataExecuteStrategy.java
+++ b/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/monitor/AbstractMonitorDataExecuteStrategy.java
@@ -27,14 +27,14 @@ public abstract class AbstractMonitorDataExecuteStrategy {
/**
* Mark.
*
- * @return
+ * @return mark
*/
public abstract String mark();
/**
* Execute.
*
- * @param message
+ * @param message message
*/
public abstract void execute(T message);
}
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/monitor/QueryMonitorExecuteChoose.java b/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/monitor/QueryMonitorExecuteChoose.java
index 2dfd9a6b..525ee8ee 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/monitor/QueryMonitorExecuteChoose.java
+++ b/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/monitor/QueryMonitorExecuteChoose.java
@@ -33,7 +33,7 @@ import java.util.Map;
public class QueryMonitorExecuteChoose implements CommandLineRunner {
/**
- * Storage monitoring data execution container.
+ * Storage monitoring data execution container
*/
private Map monitorDataExecuteStrategyChooseMap = new HashMap<>();
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/notify/DefaultPublisher.java b/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/notify/DefaultPublisher.java
index 7b8f67e6..39612b11 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/notify/DefaultPublisher.java
+++ b/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/notify/DefaultPublisher.java
@@ -63,7 +63,6 @@ public class DefaultPublisher extends Thread implements EventPublisher {
@Override
public synchronized void start() {
if (!initialized) {
- // start just called once
super.start();
if (queueMaxSize == -1) {
queueMaxSize = NotifyCenter.ringBufferSize;
@@ -100,7 +99,7 @@ public class DefaultPublisher extends Thread implements EventPublisher {
UPDATER.compareAndSet(this, lastEventSequence, Math.max(lastEventSequence, event.sequence()));
}
} catch (Throwable ex) {
- log.error("Event listener exception: {}", ex);
+ log.error("Event listener exception.", ex);
}
}
@@ -123,9 +122,7 @@ public class DefaultPublisher extends Thread implements EventPublisher {
@Override
public void notifySubscriber(AbstractSubscriber subscriber, AbstractEvent event) {
final Runnable job = () -> subscriber.onEvent(event);
-
final Executor executor = subscriber.executor();
-
if (executor != null) {
executor.execute(job);
} else {
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/notify/EventPublisher.java b/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/notify/EventPublisher.java
index 858b30f2..1a726308 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/notify/EventPublisher.java
+++ b/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/notify/EventPublisher.java
@@ -28,31 +28,31 @@ public interface EventPublisher {
/**
* Init.
*
- * @param type
- * @param bufferSize
+ * @param type type
+ * @param bufferSize buffer size
*/
void init(Class extends AbstractEvent> type, int bufferSize);
/**
* Add subscriber.
*
- * @param subscriber
+ * @param subscriber subscriber
*/
void addSubscriber(AbstractSubscriber subscriber);
/**
* Publish.
*
- * @param event
- * @return
+ * @param event event
+ * @return publish result
*/
boolean publish(AbstractEvent event);
/**
* Notify subscriber.
*
- * @param subscriber
- * @param event
+ * @param subscriber subscriber
+ * @param event event
*/
void notifySubscriber(AbstractSubscriber subscriber, AbstractEvent event);
}
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/notify/NotifyCenter.java b/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/notify/NotifyCenter.java
index 0fce3453..78101e86 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/notify/NotifyCenter.java
+++ b/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/notify/NotifyCenter.java
@@ -43,11 +43,9 @@ public class NotifyCenter {
private DefaultSharePublisher sharePublisher;
- private static Class extends EventPublisher> clazz = null;
-
private static EventPublisher eventPublisher = new DefaultPublisher();
- private static BiFunction, Integer, EventPublisher> publisherFactory = null;
+ private static BiFunction, Integer, EventPublisher> publisherFactory;
private final Map publisherMap = new ConcurrentHashMap(16);
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/notify/listener/AbstractSubscriber.java b/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/notify/listener/AbstractSubscriber.java
index 16357b47..50705b97 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/notify/listener/AbstractSubscriber.java
+++ b/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/notify/listener/AbstractSubscriber.java
@@ -40,6 +40,11 @@ public abstract class AbstractSubscriber {
*/
public abstract Class extends AbstractEvent> subscribeType();
+ /**
+ * Executor.
+ *
+ * @return executor
+ */
public Executor executor() {
return null;
}
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/service/ConfigChangePublisher.java b/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/service/ConfigChangePublisher.java
index 084c8925..7ae44a12 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/service/ConfigChangePublisher.java
+++ b/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/service/ConfigChangePublisher.java
@@ -28,7 +28,7 @@ public class ConfigChangePublisher {
/**
* Notify configChange.
*
- * @param event
+ * @param event event
*/
public static void notifyConfigChange(LocalDataChangeEvent event) {
NotifyCenter.publishEvent(event);
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/service/LongPollingService.java b/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/service/LongPollingService.java
index b5d667a0..a485048c 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/service/LongPollingService.java
+++ b/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/service/LongPollingService.java
@@ -68,13 +68,9 @@ public class LongPollingService {
@Override
public void onEvent(AbstractEvent event) {
- if (isFixedPolling()) {
- // Ignore.
- } else {
- if (event instanceof LocalDataChangeEvent) {
- LocalDataChangeEvent evt = (LocalDataChangeEvent) event;
- ConfigExecutor.executeLongPolling(new DataChangeTask(evt.identify, evt.groupKey));
- }
+ if (!isFixedPolling() && event instanceof LocalDataChangeEvent) {
+ LocalDataChangeEvent evt = (LocalDataChangeEvent) event;
+ ConfigExecutor.executeLongPolling(new DataChangeTask(evt.identify, evt.groupKey));
}
}
@@ -300,11 +296,11 @@ public class LongPollingService {
/**
* Is support long polling.
*
- * @param req
+ * @param request
* @return
*/
- public static boolean isSupportLongPolling(HttpServletRequest req) {
- return null != req.getHeader(LONG_POLLING_HEADER);
+ public static boolean isSupportLongPolling(HttpServletRequest request) {
+ return request.getHeader(LONG_POLLING_HEADER) != null;
}
/**
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/ConfigServiceImpl.java b/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/ConfigServiceImpl.java
index bf70a5b9..ab5c43a2 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/ConfigServiceImpl.java
+++ b/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/ConfigServiceImpl.java
@@ -151,7 +151,7 @@ public class ConfigServiceImpl implements ConfigService {
ConfigServiceImpl configService = ApplicationContextHolder.getBean(this.getClass());
configService.updateConfigInfo(null, false, configAllInfo);
}
- DynamicThreadPoolRegisterServerNotifyParameter serverNotifyParameter = registerWrapper.getDynamicThreadPoolRegisterServerNotifyParameter();
+ DynamicThreadPoolRegisterServerNotifyParameter serverNotifyParameter = registerWrapper.getServerNotify();
if (serverNotifyParameter != null) {
ArrayList notifyTypes = new ArrayList<>();
Collections.addAll(notifyTypes, "CONFIG", "ALARM");
@@ -177,7 +177,7 @@ public class ConfigServiceImpl implements ConfigService {
}
private ConfigAllInfo parseConfigAllInfo(DynamicThreadPoolRegisterWrapper registerWrapper) {
- DynamicThreadPoolRegisterParameter registerParameter = registerWrapper.getDynamicThreadPoolRegisterParameter();
+ DynamicThreadPoolRegisterParameter registerParameter = registerWrapper.getParameter();
ConfigAllInfo configAllInfo = JSONUtil.parseObject(JSONUtil.toJSONString(registerParameter), ConfigAllInfo.class);
configAllInfo.setTenantId(registerWrapper.getTenantId());
configAllInfo.setItemId(registerWrapper.getItemId());
diff --git a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/verify/ConfigModificationVerifyServiceChoose.java b/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/verify/ConfigModificationVerifyServiceChoose.java
index 98769559..2eb72589 100644
--- a/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/verify/ConfigModificationVerifyServiceChoose.java
+++ b/hippo4j-server/hippo4j-config/src/main/java/cn/hippo4j/config/verify/ConfigModificationVerifyServiceChoose.java
@@ -33,7 +33,7 @@ import java.util.Map;
public class ConfigModificationVerifyServiceChoose implements CommandLineRunner {
/**
- * Storage config change verify service container.
+ * Storage config change verify service container
*/
private Map configChangeVerifyServiceChooseMap = new HashMap<>();
@@ -44,8 +44,7 @@ public class ConfigModificationVerifyServiceChoose implements CommandLineRunner
* @return
*/
public ConfigModificationVerifyService choose(Integer type) {
- ConfigModificationVerifyService verifyService = configChangeVerifyServiceChooseMap.get(type);
- return verifyService;
+ return configChangeVerifyServiceChooseMap.get(type);
}
@Override
diff --git a/hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/client/RPCClientTest.java b/hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/client/RPCClientTest.java
deleted file mode 100644
index 54c2633e..00000000
--- a/hippo4j-server/hippo4j-config/src/test/java/cn/hippo4j/config/rpc/client/RPCClientTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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 cn.hippo4j.config.rpc.client;
-
-import cn.hippo4j.config.rpc.request.DefaultRequest;
-import cn.hippo4j.config.rpc.request.Request;
-import cn.hippo4j.config.rpc.response.Response;
-import cn.hippo4j.config.rpc.server.NettyServerConnection;
-import cn.hippo4j.config.rpc.server.RPCServer;
-import cn.hippo4j.config.rpc.server.ServerConnection;
-import cn.hippo4j.config.rpc.support.DefaultInstance;
-import cn.hippo4j.config.rpc.support.Instance;
-import cn.hippo4j.config.rpc.support.ClassRegistry;
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.io.IOException;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
-
-public class RPCClientTest {
-
- String host = "localhost";
- int port = 8888;
-
- @Test
- public void connection() throws IOException {
-
- Class cls = CallManager.class;
- String className = cls.getName();
- ClassRegistry.put(className, cls);
- // The mode connection was denied when the server was started on the specified port
- Instance instance = new DefaultInstance();
- ServerConnection connection = new NettyServerConnection(instance);
- RPCServer rpcServer = new RPCServer(port, connection);
- CompletableFuture.runAsync(rpcServer::bind);
- try {
- TimeUnit.SECONDS.sleep(3);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- NettyClientConnection clientConnection = new NettyClientConnection(host, port);
- RPCClient rpcClient = new RPCClient(clientConnection);
- Request request = new DefaultRequest("127.0.0.18888", className, "call", null, null);
- for (int i = 0; i < 100; i++) {
- Response response = rpcClient.connection(request);
- Assert.assertEquals(response.getObj(), 1);
- }
- rpcClient.close();
- rpcServer.close();
- }
-
-}
\ No newline at end of file
diff --git a/hippo4j-server/hippo4j-console/pom.xml b/hippo4j-server/hippo4j-console/pom.xml
index 5f89640a..193658a6 100644
--- a/hippo4j-server/hippo4j-console/pom.xml
+++ b/hippo4j-server/hippo4j-console/pom.xml
@@ -29,9 +29,5 @@
hippo4j-auth${revision}
-
- org.hibernate.validator
- hibernate-validator
-
diff --git a/hippo4j-server/hippo4j-console/src/main/resources/static/index.html b/hippo4j-server/hippo4j-console/src/main/resources/static/index.html
index 16ce63d4..6fb8e8db 100644
--- a/hippo4j-server/hippo4j-console/src/main/resources/static/index.html
+++ b/hippo4j-server/hippo4j-console/src/main/resources/static/index.html
@@ -1 +1 @@
-Hippo4J Web
\ No newline at end of file
+Hippo4J Web
\ No newline at end of file
diff --git a/hippo4j-server/hippo4j-console/src/main/resources/static/static/css/chunk-70528506.0840a153.css b/hippo4j-server/hippo4j-console/src/main/resources/static/static/css/chunk-65cbbb82.fcbf3365.css
similarity index 85%
rename from hippo4j-server/hippo4j-console/src/main/resources/static/static/css/chunk-70528506.0840a153.css
rename to hippo4j-server/hippo4j-console/src/main/resources/static/static/css/chunk-65cbbb82.fcbf3365.css
index 560ca5db..3195dc02 100644
--- a/hippo4j-server/hippo4j-console/src/main/resources/static/static/css/chunk-70528506.0840a153.css
+++ b/hippo4j-server/hippo4j-console/src/main/resources/static/static/css/chunk-65cbbb82.fcbf3365.css
@@ -1 +1 @@
-.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.dashboard-editor-container[data-v-a25e0782]{padding:32px;background-color:#f0f2f5;position:relative;min-height:100vh}
\ No newline at end of file
+.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.dashboard-editor-container[data-v-6226f7fa]{padding:32px;background-color:#f0f2f5;position:relative;min-height:100vh}
\ No newline at end of file
diff --git a/hippo4j-server/hippo4j-console/src/main/resources/static/static/js/app.a27d19f1.js b/hippo4j-server/hippo4j-console/src/main/resources/static/static/js/app.d0f020af.js
similarity index 99%
rename from hippo4j-server/hippo4j-console/src/main/resources/static/static/js/app.a27d19f1.js
rename to hippo4j-server/hippo4j-console/src/main/resources/static/static/js/app.d0f020af.js
index 20ce4db4..6a1c388c 100644
--- a/hippo4j-server/hippo4j-console/src/main/resources/static/static/js/app.a27d19f1.js
+++ b/hippo4j-server/hippo4j-console/src/main/resources/static/static/js/app.d0f020af.js
@@ -1 +1 @@
-(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["app"],{0:function(t,e,n){t.exports=n("56d7")},"0781":function(t,e,n){"use strict";n.r(e);var a=n("24ab"),i=n.n(a),o=n("83d6"),c=n.n(o),r=c.a.showSettings,s=c.a.tagsView,l=c.a.fixedHeader,u=c.a.sidebarLogo,d={theme:i.a.theme,showSettings:r,tagsView:s,fixedHeader:l,sidebarLogo:u},f={CHANGE_SETTING:function(t,e){var n=e.key,a=e.value;t.hasOwnProperty(n)&&(t[n]=a)}},h={changeSetting:function(t,e){var n=t.commit;n("CHANGE_SETTING",e)}};e["default"]={namespaced:!0,state:d,mutations:f,actions:h}},"07c6":function(t,e,n){"use strict";n("48c1")},"0d3d":function(t,e,n){"use strict";n("a4f4")},"0f9a":function(t,e,n){"use strict";n.r(e);var a=n("c80c"),i=(n("96cf"),n("3b8d")),o=n("b775");function c(t){return Object(o["a"])({url:"/hippo4j/v1/cs/auth/login",method:"post",data:t})}var r=n("5f87"),s=n("a18c"),l={token:Object(r["a"])(),name:"",avatar:"",introduction:"",roles:[]},u={SET_TOKEN:function(t,e){t.token=e},SET_INTRODUCTION:function(t,e){t.introduction=e},SET_NAME:function(t,e){t.name=e},SET_AVATAR:function(t,e){t.avatar=e},SET_ROLES:function(t,e){t.roles=e}},d={login:function(t,e){var n=t.commit,a=e.username,i=e.password;return new Promise((function(t,e){c({username:a.trim(),password:i,rememberMe:1}).then((function(e){var a=e.data,i=e.roles;n("SET_TOKEN",a),localStorage.setItem("roles",JSON.stringify(i)),localStorage.setItem("USER_ROLE",i[0]),Object(r["c"])(a),t()})).catch((function(t){alert("登录失败"),e(t)}))}))},getInfo:function(t){var e=t.commit;t.state;return new Promise((function(t,n){var a={};a.roles=JSON.parse(localStorage.getItem("roles")),e("SET_ROLES",a.roles),t(a)}))},logout:function(t){var e=t.commit;t.state;return new Promise((function(t){e("SET_TOKEN",""),e("SET_ROLES",[]),Object(r["b"])(),Object(s["d"])(),t()}))},resetToken:function(t){var e=t.commit;return new Promise((function(t){e("SET_TOKEN",""),e("SET_ROLES",[]),Object(r["b"])(),t()}))},changeRoles:function(t,e){var n=t.commit,o=t.dispatch;return new Promise(function(){var t=Object(i["a"])(Object(a["a"])().mark((function t(i){var c,l,u,d;return Object(a["a"])().wrap((function(t){while(1)switch(t.prev=t.next){case 0:return c=e+"-token",n("SET_TOKEN",c),Object(r["c"])(c),t.next=5,o("getInfo");case 5:return l=t.sent,u=l.roles,Object(s["d"])(),t.next=10,o("permission/generateRoutes",u,{root:!0});case 10:d=t.sent,s["c"].addRoutes(d),o("tagsView/delAllViews",null,{root:!0}),i();case 14:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}())}};e["default"]={namespaced:!0,state:l,mutations:u,actions:d}},"119b":function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-other4",use:"icon-other4-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},1424:function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-tenant_logo2",use:"icon-tenant_logo2-usage",viewBox:"0 0 1331 1024",content:''});c.a.add(r);e["default"]=r},"187a":function(t,e,n){},"24ab":function(t,e,n){t.exports={theme:"#1890ff"}},2538:function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-json",use:"icon-json-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},2580:function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-language",use:"icon-language-usage",viewBox:"0 0 128 128",content:''});c.a.add(r);e["default"]=r},"273d":function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-user6",use:"icon-user6-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},"29aa":function(t,e,n){},3150:function(t,e,n){},"31c2":function(t,e,n){"use strict";n.r(e),n.d(e,"filterAsyncRoutes",(function(){return c}));var a=n("db72"),i=(n("ac6a"),n("6762"),n("2fdb"),n("a18c"));function o(t,e){return!e.meta||!e.meta.roles||t.some((function(t){return e.meta.roles.includes(t)}))}function c(t,e){var n=[];return t.forEach((function(t){var i=Object(a["a"])({},t);o(e,i)&&(i.children&&(i.children=c(i.children,e)),n.push(i))})),n}var r={routes:[],addRoutes:[]},s={SET_ROUTES:function(t,e){t.addRoutes=e,t.routes=i["b"].concat(e)}},l={generateRoutes:function(t,e){var n=t.commit;return new Promise((function(t){var a;a=e.includes("ROLE_ADMIN")?i["a"]||[]:c(i["a"],e),n("SET_ROUTES",a),t(a)}))}};e["default"]={namespaced:!0,state:r,mutations:s,actions:l}},4093:function(t,e,n){},4213:function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-link3",use:"icon-link3-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},4360:function(t,e,n){"use strict";n("a481"),n("ac6a");var a=n("2b0e"),i=n("2f62"),o=(n("7f7f"),{sidebar:function(t){return t.app.sidebar},size:function(t){return t.app.size},device:function(t){return t.app.device},visitedViews:function(t){return t.tagsView.visitedViews},cachedViews:function(t){return t.tagsView.cachedViews},token:function(t){return t.user.token},avatar:function(t){return t.user.avatar},name:function(t){return t.user.name},introduction:function(t){return t.user.introduction},roles:function(t){return t.user.roles},permission_routes:function(t){return t.permission.routes},errorLogs:function(t){return t.errorLog.logs}}),c=o;a["default"].use(i["a"]);var r=n("c653"),s=r.keys().reduce((function(t,e){var n=e.replace(/^\.\/(.*)\.\w+$/,"$1"),a=r(e);return t[n]=a.default,t}),{}),l=new i["a"].Store({modules:s,getters:c});e["a"]=l},"48c1":function(t,e,n){},"4d49":function(t,e,n){"use strict";n.r(e);var a={logs:[]},i={ADD_ERROR_LOG:function(t,e){t.logs.push(e)},CLEAR_ERROR_LOG:function(t){t.logs.splice(0)}},o={addErrorLog:function(t,e){var n=t.commit;n("ADD_ERROR_LOG",e)},clearErrorLog:function(t){var e=t.commit;e("CLEAR_ERROR_LOG")}};e["default"]={namespaced:!0,state:a,mutations:i,actions:o}},"51ff":function(t,e,n){var a={"./404.svg":"a14a","./audit.svg":"d393","./dashboard2.svg":"ea93","./item4.svg":"f385","./item_logo4.svg":"8811","./json.svg":"2538","./language.svg":"2580","./lessee.svg":"dbd7","./link3.svg":"4213","./log3.svg":"6ba9","./notify.svg":"5448","./other4.svg":"119b","./pool3.svg":"a551","./tenant_logo2.svg":"1424","./threadPool_logo1.svg":"b6d1","./threadPool_logo2.svg":"9bc4","./user6.svg":"273d","./vessel3.svg":"6e71"};function i(t){var e=o(t);return n(e)}function o(t){var e=a[t];if(!(e+1)){var n=new Error("Cannot find module '"+t+"'");throw n.code="MODULE_NOT_FOUND",n}return e}i.keys=function(){return Object.keys(a)},i.resolve=o,t.exports=i,i.id="51ff"},5448:function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-notify",use:"icon-notify-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},"56d7":function(t,e,n){"use strict";n.r(e);var a={};n.r(a),n.d(a,"parseTime",(function(){return $["c"]})),n.d(a,"formatTime",(function(){return $["b"]})),n.d(a,"timeAgo",(function(){return R})),n.d(a,"numberFormatter",(function(){return P})),n.d(a,"toThousandFilter",(function(){return I})),n.d(a,"uppercaseFirst",(function(){return N}));n("456d"),n("ac6a"),n("cadf"),n("551c"),n("f751"),n("097d");var i=n("2b0e"),o=n("a78e"),c=n.n(o),r=(n("f5df"),n("5c96")),s=n.n(r),l=(n("24ab"),n("b20f"),function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{attrs:{id:"app"}},[n("router-view")],1)}),u=[],d={name:"App"},f=d,h=n("2877"),p=Object(h["a"])(f,l,u,!1,null,null,null),m=p.exports,v=n("4360"),b=n("a18c"),g=function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.isExternal?n("div",t._g({staticClass:"svg-external-icon svg-icon",style:t.styleExternalIcon},t.$listeners)):n("svg",t._g({class:t.svgClass,attrs:{"aria-hidden":"true"}},t.$listeners),[n("use",{attrs:{"xlink:href":t.iconName}})])},w=[],x=n("61f7"),y={name:"SvgIcon",props:{iconClass:{type:String,required:!0},className:{type:String,default:""}},computed:{isExternal:function(){return Object(x["a"])(this.iconClass)},iconName:function(){return"#icon-".concat(this.iconClass)},svgClass:function(){return this.className?"svg-icon "+this.className:"svg-icon"},styleExternalIcon:function(){return{mask:"url(".concat(this.iconClass,") no-repeat 50% 50%"),"-webkit-mask":"url(".concat(this.iconClass,") no-repeat 50% 50%")}}}},_=y,k=(n("64df"),Object(h["a"])(_,g,w,!1,null,"f9f7fefc",null)),M=k.exports;i["default"].component("svg-icon",M);var E=n("51ff"),z=function(t){return t.keys().map(t)};z(E);var C=n("c80c"),O=n("db72"),L=(n("96cf"),n("3b8d")),S=n("323e"),j=n.n(S),A=(n("a5d8"),n("5f87")),B=n("83d6"),H=n.n(B),T=H.a.title||"Vue Element Admin";function F(t){return t?"".concat(t," - ").concat(T):"".concat(T)}j.a.configure({showSpinner:!1});var V=["/login","/auth-redirect"];b["c"].beforeEach(function(){var t=Object(L["a"])(Object(C["a"])().mark((function t(e,n,a){var i,o,c,s,l;return Object(C["a"])().wrap((function(t){while(1)switch(t.prev=t.next){case 0:if(j.a.start(),document.title=F(e.meta.title),i=Object(A["a"])(),!i){t.next=35;break}if("/login"!==e.path){t.next=9;break}a({path:"/"}),j.a.done(),t.next=33;break;case 9:if(o=v["a"].getters.roles&&v["a"].getters.roles.length>0,!o){t.next=14;break}a(),t.next=33;break;case 14:return t.prev=14,t.next=17,v["a"].dispatch("user/getInfo");case 17:return c=t.sent,s=c.roles,t.next=21,v["a"].dispatch("permission/generateRoutes",s);case 21:l=t.sent,b["c"].addRoutes(l),a(Object(O["a"])(Object(O["a"])({},e),{},{replace:!0})),t.next=33;break;case 26:return t.prev=26,t.t0=t["catch"](14),t.next=30,v["a"].dispatch("user/resetToken");case 30:r["Message"].error(t.t0||"Has Error"),a("/login?redirect=".concat(e.path)),j.a.done();case 33:t.next=36;break;case 35:-1!==V.indexOf(e.path)?a():(a("/login?redirect=".concat(e.path)),j.a.done());case 36:case"end":return t.stop()}}),t,null,[[14,26]])})));return function(e,n,a){return t.apply(this,arguments)}}()),b["c"].afterEach((function(){j.a.done()}));n("6b54"),n("a481"),n("c5f6");var $=n("ed08");function D(t,e){return 1===t?t+e:t+e+"s"}function R(t){var e=Date.now()/1e3-Number(t);return e<3600?D(~~(e/60)," minute"):e<86400?D(~~(e/3600)," hour"):D(~~(e/86400)," day")}function P(t,e){for(var n=[{value:1e18,symbol:"E"},{value:1e15,symbol:"P"},{value:1e12,symbol:"T"},{value:1e9,symbol:"G"},{value:1e6,symbol:"M"},{value:1e3,symbol:"k"}],a=0;a=n[a].value)return(t/n[a].value+.1).toFixed(e).replace(/\.0+$|(\.[0-9]*[1-9])0+$/,"$1")+n[a].symbol;return t.toString()}function I(t){return(+t||0).toString().replace(/^-?\d+/g,(function(t){return t.replace(/(?=(?!\b)(\d{3})+$)/g,",")}))}function N(t){return t.charAt(0).toUpperCase()+t.slice(1)}var G=n("313e"),q=n("00e7"),U=n.n(q);i["default"].prototype.$echarts=G["default"],i["default"].prototype.$cookie=U.a,i["default"].use(s.a,{size:c.a.get("size")||"medium"}),Object.keys(a).forEach((function(t){i["default"].filter(t,a[t])})),i["default"].config.productionTip=!1,new i["default"]({el:"#app",router:b["c"],store:v["a"],render:function(t){return t(m)}})},"5e10":function(t,e,n){"use strict";n("3150")},"5f87":function(t,e,n){"use strict";n.d(e,"a",(function(){return c})),n.d(e,"c",(function(){return r})),n.d(e,"b",(function(){return s}));var a=n("a78e"),i=n.n(a),o="Admin-Token";function c(){return i.a.get(o)}function r(t){return i.a.set(o,t)}function s(){return i.a.remove(o)}},"61f7":function(t,e,n){"use strict";n.d(e,"a",(function(){return a}));n("6b54");function a(t){return/^(https?:|mailto:|tel:)/.test(t)}},"64df":function(t,e,n){"use strict";n("78bf")},6820:function(t,e,n){"use strict";n("4093")},"6ba9":function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-log3",use:"icon-log3-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},"6e71":function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-vessel3",use:"icon-vessel3-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},"78bf":function(t,e,n){},8326:function(t,e,n){},"83d6":function(t,e){t.exports={title:"Hippo4J Web",showSettings:!0,tagsView:!0,fixedHeader:!1,sidebarLogo:!0,errorLog:"production"}},8811:function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-item_logo4",use:"icon-item_logo4-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},"89f5":function(t,e,n){"use strict";n("29aa")},"8af8":function(t,e,n){"use strict";n("9c98")},"9bc4":function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-threadPool_logo2",use:"icon-threadPool_logo2-usage",viewBox:"0 0 1044 1024",content:''});c.a.add(r);e["default"]=r},"9c98":function(t,e,n){},a14a:function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-404",use:"icon-404-usage",viewBox:"0 0 128 128",content:''});c.a.add(r);e["default"]=r},a18c:function(t,e,n){"use strict";var a,i,o=n("2b0e"),c=n("8c4f"),r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"app-wrapper",class:t.classObj},["mobile"===t.device&&t.sidebar.opened?n("div",{staticClass:"drawer-bg",on:{click:t.handleClickOutside}}):t._e(),t._v(" "),n("sidebar",{staticClass:"sidebar-container"}),t._v(" "),n("div",{staticClass:"main-container"},[n("div",{class:{"fixed-header":t.fixedHeader}},[n("navbar")],1),t._v(" "),n("app-main")],1)],1)},s=[],l=n("db72"),u=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("section",{staticClass:"app-main"},[n("transition",{attrs:{name:"fade-transform",mode:"out-in"}},[n("router-view",{key:t.key})],1)],1)},d=[],f={name:"AppMain",computed:{cachedViews:function(){return this.$store.state.tagsView.cachedViews},key:function(){return this.$route.path}}},h=f,p=(n("5e10"),n("0d3d"),n("2877")),m=Object(p["a"])(h,u,d,!1,null,"5ad61798",null),v=m.exports,b=function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"navbar"},[a("hamburger",{staticClass:"hamburger-container",attrs:{id:"hamburger-container","is-active":t.sidebar.opened},on:{toggleClick:t.toggleSideBar}}),t._v(" "),a("breadcrumb",{staticClass:"breadcrumb-container",attrs:{id:"breadcrumb-container"}}),t._v(" "),a("div",{staticClass:"right-menu"},["mobile"!==t.device?void 0:t._e(),t._v(" "),a("el-dropdown",{staticClass:"avatar-container right-menu-item hover-effect",attrs:{trigger:"click"}},[a("div",{staticClass:"avatar-wrapper"},[a("img",{staticClass:"user-avatar",attrs:{src:n("f561")}}),t._v(" "),a("i",{staticClass:"el-icon-caret-bottom"})]),t._v(" "),a("el-dropdown-menu",{attrs:{slot:"dropdown"},slot:"dropdown"},[a("router-link",{attrs:{to:"/"}},[a("el-dropdown-item",[t._v("Dashboard")])],1),t._v(" "),a("el-dropdown-item",{attrs:{divided:""}},[a("span",{staticStyle:{display:"block"},on:{click:t.logout}},[t._v("Log Out")])])],1)],1)],2)],1)},g=[],w=n("c80c"),x=(n("96cf"),n("3b8d")),y=n("2f62"),_=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("el-breadcrumb",{staticClass:"app-breadcrumb",attrs:{separator:"/"}},[n("transition-group",{attrs:{name:"breadcrumb"}},t._l(t.levelList,(function(e,a){return n("el-breadcrumb-item",{key:e.path},["noRedirect"===e.redirect||a==t.levelList.length-1?n("span",{staticClass:"no-redirect"},[t._v(t._s(e.meta.title))]):n("a",{on:{click:function(n){return n.preventDefault(),t.handleLink(e)}}},[t._v(t._s(e.meta.title))])])})),1)],1)},k=[],M=(n("7f7f"),n("f559"),n("bd11")),E=n.n(M),z={data:function(){return{levelList:null}},watch:{$route:function(t){t.path.startsWith("/redirect/")||this.getBreadcrumb()}},created:function(){this.getBreadcrumb()},methods:{getBreadcrumb:function(){var t=this.$route.matched.filter((function(t){return t.meta&&t.meta.title})),e=t[0];this.isDashboard(e)||(t=[{path:"/dashboard",meta:{title:"Dashboard"}}].concat(t)),this.levelList=t.filter((function(t){return t.meta&&t.meta.title&&!1!==t.meta.breadcrumb}))},isDashboard:function(t){var e=t&&t.name;return!!e&&e.trim().toLocaleLowerCase()==="Dashboard".toLocaleLowerCase()},pathCompile:function(t){var e=this.$route.params,n=E.a.compile(t);return n(e)},handleLink:function(t){var e=t.redirect,n=t.path;e?this.$router.push(e):this.$router.push(this.pathCompile(n))}}},C=z,O=(n("89f5"),Object(p["a"])(C,_,k,!1,null,"1919fc1a",null)),L=O.exports,S=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticStyle:{padding:"0 15px"},on:{click:t.toggleClick}},[n("svg",{staticClass:"hamburger",class:{"is-active":t.isActive},attrs:{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg",width:"64",height:"64"}},[n("path",{attrs:{d:"M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z"}})])])},j=[],A={name:"Hamburger",props:{isActive:{type:Boolean,default:!1}},methods:{toggleClick:function(){this.$emit("toggleClick")}}},B=A,H=(n("d49d"),Object(p["a"])(B,S,j,!1,null,"49e15297",null)),T=H.exports,F=function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.errorLogs.length>0?n("div",[n("el-badge",{staticStyle:{"line-height":"25px","margin-top":"-5px"},attrs:{"is-dot":!0},nativeOn:{click:function(e){t.dialogTableVisible=!0}}},[n("el-button",{staticStyle:{padding:"8px 10px"},attrs:{size:"small",type:"danger"}},[n("svg-icon",{attrs:{"icon-class":"bug"}})],1)],1),t._v(" "),n("el-dialog",{attrs:{visible:t.dialogTableVisible,width:"80%","append-to-body":""},on:{"update:visible":function(e){t.dialogTableVisible=e}}},[n("div",{attrs:{slot:"title"},slot:"title"},[n("span",{staticStyle:{"padding-right":"10px"}},[t._v("Error Log")]),t._v(" "),n("el-button",{attrs:{size:"mini",type:"primary",icon:"el-icon-delete"},on:{click:t.clearAll}},[t._v("Clear All")])],1),t._v(" "),n("el-table",{attrs:{data:t.errorLogs,border:""}},[n("el-table-column",{attrs:{label:"Message"},scopedSlots:t._u([{key:"default",fn:function(e){var a=e.row;return[n("div",[n("span",{staticClass:"message-title"},[t._v("Msg:")]),t._v(" "),n("el-tag",{attrs:{type:"danger"}},[t._v("\n "+t._s(a.err.message)+"\n ")])],1),t._v(" "),n("br"),t._v(" "),n("div",[n("span",{staticClass:"message-title",staticStyle:{"padding-right":"10px"}},[t._v("Info: ")]),t._v(" "),n("el-tag",{attrs:{type:"warning"}},[t._v("\n "+t._s(a.vm.$vnode.tag)+" error in "+t._s(a.info)+"\n ")])],1),t._v(" "),n("br"),t._v(" "),n("div",[n("span",{staticClass:"message-title",staticStyle:{"padding-right":"16px"}},[t._v("Url: ")]),t._v(" "),n("el-tag",{attrs:{type:"success"}},[t._v("\n "+t._s(a.url)+"\n ")])],1)]}}],null,!1,3621415002)}),t._v(" "),n("el-table-column",{attrs:{label:"Stack"},scopedSlots:t._u([{key:"default",fn:function(e){return[t._v("\n "+t._s(e.row.err.stack)+"\n ")]}}],null,!1,1726869048)})],1)],1)],1):t._e()},V=[],$={name:"ErrorLog",data:function(){return{dialogTableVisible:!1}},computed:{errorLogs:function(){return this.$store.getters.errorLogs}},methods:{clearAll:function(){this.dialogTableVisible=!1,this.$store.dispatch("errorLog/clearErrorLog")}}},D=$,R=(n("b36c"),Object(p["a"])(D,F,V,!1,null,"be34583a",null)),P=R.exports,I={components:{Breadcrumb:L,Hamburger:T,ErrorLog:P},computed:Object(l["a"])({},Object(y["b"])(["sidebar","avatar","device"])),methods:{toggleSideBar:function(){this.$store.dispatch("app/toggleSideBar")},logout:function(){var t=Object(x["a"])(Object(w["a"])().mark((function t(){return Object(w["a"])().wrap((function(t){while(1)switch(t.prev=t.next){case 0:return this.$cookie.delete("userName"),t.next=3,this.$store.dispatch("user/logout");case 3:this.$router.push("/login?redirect=".concat(this.$route.fullPath));case 4:case"end":return t.stop()}}),t,this)})));function e(){return t.apply(this,arguments)}return e}()}},N=I,G=(n("07c6"),Object(p["a"])(N,b,g,!1,null,"6ab05616",null)),q=G.exports,U=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{class:{"has-logo":t.showLogo}},[t.showLogo?n("logo",{attrs:{collapse:t.isCollapse}}):t._e(),t._v(" "),n("el-scrollbar",{attrs:{"wrap-class":"scrollbar-wrapper"}},[n("el-menu",{attrs:{"default-active":t.activeMenu,collapse:t.isCollapse,"background-color":t.variables.menuBg,"text-color":t.variables.menuText,"unique-opened":!1,"active-text-color":t.variables.menuActiveText,"collapse-transition":!1,mode:"vertical"}},t._l(t.permission_routes,(function(t){return n("sidebar-item",{key:t.path,attrs:{item:t,"base-path":t.path}})})),1)],1)],1)},J=[],K=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"sidebar-logo-container",class:{collapse:t.collapse}},[n("transition",{attrs:{name:"sidebarLogoFade"}},[t.collapse?n("router-link",{key:"collapse",staticClass:"sidebar-logo-link",attrs:{to:"/"}},[t.logo?n("img",{staticClass:"sidebar-logo",attrs:{src:t.logo}}):n("h1",{staticClass:"sidebar-title"},[t._v(t._s(t.title))])]):n("router-link",{key:"expand",staticClass:"sidebar-logo-link",attrs:{to:"/"}},[t.logo?n("img",{staticClass:"sidebar-logo",attrs:{src:t.logo}}):t._e(),t._v(" "),n("h1",{staticClass:"sidebar-title"},[t._v(t._s(t.title))])])],1)],1)},Q=[],W={name:"SidebarLogo",props:{collapse:{type:Boolean,required:!0}},data:function(){return{title:"hippo4j 1.4.3"}}},Z=W,Y=(n("8af8"),Object(p["a"])(Z,K,Q,!1,null,"741ab93c",null)),X=Y.exports,tt=function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.item.hidden?t._e():n("div",{staticClass:"menu-wrapper"},[!t.hasOneShowingChild(t.item.children,t.item)||t.onlyOneChild.children&&!t.onlyOneChild.noShowingChildren||t.item.alwaysShow?n("el-submenu",{ref:"subMenu",attrs:{index:t.resolvePath(t.item.path),"popper-append-to-body":""}},[n("template",{slot:"title"},[t.item.meta?n("item",{attrs:{icon:t.item.meta&&t.item.meta.icon,title:t.item.meta.title}}):t._e()],1),t._v(" "),t._l(t.item.children,(function(e){return n("sidebar-item",{key:e.path,staticClass:"nest-menu",attrs:{"is-nest":!0,item:e,"base-path":t.resolvePath(e.path)}})}))],2):[t.onlyOneChild.meta?n("app-link",{attrs:{to:t.resolvePath(t.onlyOneChild.path)}},[n("el-menu-item",{class:{"submenu-title-noDropdown":!t.isNest},attrs:{index:t.resolvePath(t.onlyOneChild.path)}},[n("item",{attrs:{icon:t.onlyOneChild.meta.icon||t.item.meta&&t.item.meta.icon,title:t.onlyOneChild.meta.title}})],1)],1):t._e()]],2)},et=[],nt=n("df7c"),at=n.n(nt),it=n("61f7"),ot={name:"MenuItem",functional:!0,props:{icon:{type:String,default:""},title:{type:String,default:""}},render:function(t,e){var n=e.props,a=n.icon,i=n.title,o=[];return a&&o.push(t("svg-icon",{attrs:{"icon-class":a}})),i&&o.push(t("span",{slot:"title"},[i])),o}},ct=ot,rt=Object(p["a"])(ct,a,i,!1,null,null,null),st=rt.exports,lt=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("component",t._b({},"component",t.linkProps(t.to),!1),[t._t("default")],2)},ut=[],dt={props:{to:{type:String,required:!0}},methods:{linkProps:function(t){return Object(it["a"])(t)?{is:"a",href:t,target:"_blank",rel:"noopener"}:{is:"router-link",to:t}}}},ft=dt,ht=Object(p["a"])(ft,lt,ut,!1,null,null,null),pt=ht.exports,mt={computed:{device:function(){return this.$store.state.app.device}},mounted:function(){this.fixBugIniOS()},methods:{fixBugIniOS:function(){var t=this,e=this.$refs.subMenu;if(e){var n=e.handleMouseleave;e.handleMouseleave=function(e){"mobile"!==t.device&&n(e)}}}}},vt={name:"SidebarItem",components:{Item:st,AppLink:pt},mixins:[mt],props:{item:{type:Object,required:!0},isNest:{type:Boolean,default:!1},basePath:{type:String,default:""}},data:function(){return this.onlyOneChild=null,{}},methods:{hasOneShowingChild:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],n=arguments.length>1?arguments[1]:void 0,a=e.filter((function(e){return!e.hidden&&(t.onlyOneChild=e,!0)}));return 1===a.length||0===a.length&&(this.onlyOneChild=Object(l["a"])(Object(l["a"])({},n),{},{path:"",noShowingChildren:!0}),!0)},resolvePath:function(t){return Object(it["a"])(t)?t:Object(it["a"])(this.basePath)?this.basePath:at.a.resolve(this.basePath,t)}}},bt=vt,gt=Object(p["a"])(bt,tt,et,!1,null,null,null),wt=gt.exports,xt=n("cf1e"),yt=n.n(xt),_t={components:{SidebarItem:wt,Logo:X},computed:Object(l["a"])(Object(l["a"])({},Object(y["b"])(["permission_routes","sidebar"])),{},{activeMenu:function(){var t=this.$route,e=t.meta,n=t.path;return e.activeMenu?e.activeMenu:n},showLogo:function(){return this.$store.state.settings.sidebarLogo},variables:function(){return yt.a},isCollapse:function(){return!this.sidebar.opened}})},kt=_t,Mt=Object(p["a"])(kt,U,J,!1,null,null,null),Et=Mt.exports,zt=n("4360"),Ct=document,Ot=Ct.body,Lt=992,St={watch:{$route:function(t){"mobile"===this.device&&this.sidebar.opened&&zt["a"].dispatch("app/closeSideBar",{withoutAnimation:!1})}},beforeMount:function(){window.addEventListener("resize",this.$_resizeHandler)},beforeDestroy:function(){window.removeEventListener("resize",this.$_resizeHandler)},mounted:function(){var t=this.$_isMobile();t&&(zt["a"].dispatch("app/toggleDevice","mobile"),zt["a"].dispatch("app/closeSideBar",{withoutAnimation:!0}))},methods:{$_isMobile:function(){var t=Ot.getBoundingClientRect();return t.width-1'});c.a.add(r);e["default"]=r},b20f:function(t,e,n){t.exports={menuText:"#bfcbd9",menuActiveText:"#409eff",subMenuActiveText:"#f4f4f5",menuBg:"#304156",menuHover:"#263445",subMenuBg:"#1f2d3d",subMenuHover:"#001528",sideBarWidth:"210px"}},b36c:function(t,e,n){"use strict";n("187a")},b6d1:function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-threadPool_logo1",use:"icon-threadPool_logo1-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},b775:function(t,e,n){"use strict";var a=n("bc3a"),i=n.n(a),o=n("5c96"),c=n("4360"),r=n("5f87"),s=n("a18c"),l=i.a.create({baseURL:"",timeout:2e4});l.interceptors.request.use((function(t){return c["a"].getters.token&&(t.headers["Authorization"]=Object(r["a"])()),t}),(function(t){return console.log(t),Promise.reject(t)})),l.interceptors.response.use((function(t){var e=t.data;if("A000004"!==e.code){if("20000"!==e.code&&"0"!==e.code&&"200"!==e.code)return Object(o["Message"])({message:e.message||"Error",type:"error",duration:5e3}),"50008"!==e.code&&"50012"!==e.code&&"50014"!==e.code||o["MessageBox"].confirm("You have been logged out, you can cancel to stay on this page, or log in again","Confirm logout",{confirmButtonText:"Re-Login",cancelButtonText:"Cancel",type:"warning"}).then((function(){c["a"].dispatch("user/resetToken").then((function(){location.reload()}))})),Promise.reject(new Error(e.message||"Error"));var n=t.data,a=n.code;if("0"===a){var i=n.data;return i}return"200"===a?n:e}Object(r["b"])(),Object(s["d"])(),alert(e.message),document.location.href="index.html"}),(function(t){return console.log("err"+t),Object(o["Message"])({message:t.message,type:"error",duration:5e3}),Promise.reject(t)})),e["a"]=l},c653:function(t,e,n){var a={"./app.js":"d9cd","./errorLog.js":"4d49","./permission.js":"31c2","./settings.js":"0781","./user.js":"0f9a"};function i(t){var e=o(t);return n(e)}function o(t){var e=a[t];if(!(e+1)){var n=new Error("Cannot find module '"+t+"'");throw n.code="MODULE_NOT_FOUND",n}return e}i.keys=function(){return Object.keys(a)},i.resolve=o,t.exports=i,i.id="c653"},cf1e:function(t,e,n){t.exports={menuText:"#bfcbd9",menuActiveText:"#409eff",subMenuActiveText:"#f4f4f5",menuBg:"#304156",menuHover:"#263445",subMenuBg:"#1f2d3d",subMenuHover:"#001528",sideBarWidth:"210px"}},d393:function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-audit",use:"icon-audit-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},d49d:function(t,e,n){"use strict";n("8326")},d9cd:function(t,e,n){"use strict";n.r(e);var a=n("a78e"),i=n.n(a),o={sidebar:{opened:!i.a.get("sidebarStatus")||!!+i.a.get("sidebarStatus"),withoutAnimation:!1},device:"desktop",size:i.a.get("size")||"medium"},c={TOGGLE_SIDEBAR:function(t){t.sidebar.opened=!t.sidebar.opened,t.sidebar.withoutAnimation=!1,t.sidebar.opened?i.a.set("sidebarStatus",1):i.a.set("sidebarStatus",0)},CLOSE_SIDEBAR:function(t,e){i.a.set("sidebarStatus",0),t.sidebar.opened=!1,t.sidebar.withoutAnimation=e},TOGGLE_DEVICE:function(t,e){t.device=e},SET_SIZE:function(t,e){t.size=e,i.a.set("size",e)}},r={toggleSideBar:function(t){var e=t.commit;e("TOGGLE_SIDEBAR")},closeSideBar:function(t,e){var n=t.commit,a=e.withoutAnimation;n("CLOSE_SIDEBAR",a)},toggleDevice:function(t,e){var n=t.commit;n("TOGGLE_DEVICE",e)},setSize:function(t,e){var n=t.commit;n("SET_SIZE",e)}};e["default"]={namespaced:!0,state:o,mutations:c,actions:r}},dbd7:function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-lessee",use:"icon-lessee-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},ea93:function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-dashboard2",use:"icon-dashboard2-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},ed08:function(t,e,n){"use strict";n.d(e,"c",(function(){return i})),n.d(e,"b",(function(){return o})),n.d(e,"a",(function(){return c}));n("3b2b"),n("4917"),n("4f7f"),n("5df3"),n("1c4c"),n("28a5"),n("ac6a"),n("456d"),n("a481"),n("6b54");var a=n("7618");function i(t,e){if(0===arguments.length)return null;var n,i=e||"{y}-{m}-{d} {h}:{i}:{s}";"object"===Object(a["a"])(t)?n=t:("string"===typeof t&&/^[0-9]+$/.test(t)&&(t=parseInt(t)),"number"===typeof t&&10===t.toString().length&&(t*=1e3),n=new Date(t));var o={y:n.getFullYear(),m:n.getMonth()+1,d:n.getDate(),h:n.getHours(),i:n.getMinutes(),s:n.getSeconds(),a:n.getDay()},c=i.replace(/{(y|m|d|h|i|s|a)+}/g,(function(t,e){var n=o[e];return"a"===e?["日","一","二","三","四","五","六"][n]:(t.length>0&&n<10&&(n="0"+n),n||0)}));return c}function o(t,e){t=10===(""+t).length?1e3*parseInt(t):+t;var n=new Date(t),a=Date.now(),o=(a-n)/1e3;return o<30?"刚刚":o<3600?Math.ceil(o/60)+"分钟前":o<86400?Math.ceil(o/3600)+"小时前":o<172800?"1天前":e?i(t,e):n.getMonth()+1+"月"+n.getDate()+"日"+n.getHours()+"时"+n.getMinutes()+"分"}function c(t,e,n){var a,i,o,c,r,s=function s(){var l=+new Date-c;l0?a=setTimeout(s,e-l):(a=null,n||(r=t.apply(o,i),a||(o=i=null)))};return function(){for(var i=arguments.length,l=new Array(i),u=0;u'});c.a.add(r);e["default"]=r},f561:function(t,e,n){t.exports=n.p+"static/img/hippo4j.ecba1844.gif"}},[[0,"runtime","chunk-elementUI","chunk-libs"]]]);
\ No newline at end of file
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["app"],{0:function(t,e,n){t.exports=n("56d7")},"0781":function(t,e,n){"use strict";n.r(e);var a=n("24ab"),i=n.n(a),o=n("83d6"),c=n.n(o),r=c.a.showSettings,s=c.a.tagsView,l=c.a.fixedHeader,u=c.a.sidebarLogo,d={theme:i.a.theme,showSettings:r,tagsView:s,fixedHeader:l,sidebarLogo:u},f={CHANGE_SETTING:function(t,e){var n=e.key,a=e.value;t.hasOwnProperty(n)&&(t[n]=a)}},h={changeSetting:function(t,e){var n=t.commit;n("CHANGE_SETTING",e)}};e["default"]={namespaced:!0,state:d,mutations:f,actions:h}},"07c6":function(t,e,n){"use strict";n("48c1")},"0d3d":function(t,e,n){"use strict";n("a4f4")},"0f9a":function(t,e,n){"use strict";n.r(e);var a=n("c80c"),i=(n("96cf"),n("3b8d")),o=n("b775");function c(t){return Object(o["a"])({url:"/hippo4j/v1/cs/auth/login",method:"post",data:t})}var r=n("5f87"),s=n("a18c"),l={token:Object(r["a"])(),name:"",avatar:"",introduction:"",roles:[]},u={SET_TOKEN:function(t,e){t.token=e},SET_INTRODUCTION:function(t,e){t.introduction=e},SET_NAME:function(t,e){t.name=e},SET_AVATAR:function(t,e){t.avatar=e},SET_ROLES:function(t,e){t.roles=e}},d={login:function(t,e){var n=t.commit,a=e.username,i=e.password;return new Promise((function(t,e){c({username:a.trim(),password:i,rememberMe:1}).then((function(e){var a=e.data,i=e.roles;n("SET_TOKEN",a),localStorage.setItem("roles",JSON.stringify(i)),localStorage.setItem("USER_ROLE",i[0]),Object(r["c"])(a),t()})).catch((function(t){alert("登录失败"),e(t)}))}))},getInfo:function(t){var e=t.commit;t.state;return new Promise((function(t,n){var a={};a.roles=JSON.parse(localStorage.getItem("roles")),e("SET_ROLES",a.roles),t(a)}))},logout:function(t){var e=t.commit;t.state;return new Promise((function(t){e("SET_TOKEN",""),e("SET_ROLES",[]),Object(r["b"])(),Object(s["d"])(),t()}))},resetToken:function(t){var e=t.commit;return new Promise((function(t){e("SET_TOKEN",""),e("SET_ROLES",[]),Object(r["b"])(),t()}))},changeRoles:function(t,e){var n=t.commit,o=t.dispatch;return new Promise(function(){var t=Object(i["a"])(Object(a["a"])().mark((function t(i){var c,l,u,d;return Object(a["a"])().wrap((function(t){while(1)switch(t.prev=t.next){case 0:return c=e+"-token",n("SET_TOKEN",c),Object(r["c"])(c),t.next=5,o("getInfo");case 5:return l=t.sent,u=l.roles,Object(s["d"])(),t.next=10,o("permission/generateRoutes",u,{root:!0});case 10:d=t.sent,s["c"].addRoutes(d),o("tagsView/delAllViews",null,{root:!0}),i();case 14:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}())}};e["default"]={namespaced:!0,state:l,mutations:u,actions:d}},"119b":function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-other4",use:"icon-other4-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},1424:function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-tenant_logo2",use:"icon-tenant_logo2-usage",viewBox:"0 0 1331 1024",content:''});c.a.add(r);e["default"]=r},"187a":function(t,e,n){},"24ab":function(t,e,n){t.exports={theme:"#1890ff"}},2538:function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-json",use:"icon-json-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},2580:function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-language",use:"icon-language-usage",viewBox:"0 0 128 128",content:''});c.a.add(r);e["default"]=r},"273d":function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-user6",use:"icon-user6-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},"29aa":function(t,e,n){},3150:function(t,e,n){},"31c2":function(t,e,n){"use strict";n.r(e),n.d(e,"filterAsyncRoutes",(function(){return c}));var a=n("db72"),i=(n("ac6a"),n("6762"),n("2fdb"),n("a18c"));function o(t,e){return!e.meta||!e.meta.roles||t.some((function(t){return e.meta.roles.includes(t)}))}function c(t,e){var n=[];return t.forEach((function(t){var i=Object(a["a"])({},t);o(e,i)&&(i.children&&(i.children=c(i.children,e)),n.push(i))})),n}var r={routes:[],addRoutes:[]},s={SET_ROUTES:function(t,e){t.addRoutes=e,t.routes=i["b"].concat(e)}},l={generateRoutes:function(t,e){var n=t.commit;return new Promise((function(t){var a;a=e.includes("ROLE_ADMIN")?i["a"]||[]:c(i["a"],e),n("SET_ROUTES",a),t(a)}))}};e["default"]={namespaced:!0,state:r,mutations:s,actions:l}},4093:function(t,e,n){},4213:function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-link3",use:"icon-link3-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},4360:function(t,e,n){"use strict";n("a481"),n("ac6a");var a=n("2b0e"),i=n("2f62"),o=(n("7f7f"),{sidebar:function(t){return t.app.sidebar},size:function(t){return t.app.size},device:function(t){return t.app.device},visitedViews:function(t){return t.tagsView.visitedViews},cachedViews:function(t){return t.tagsView.cachedViews},token:function(t){return t.user.token},avatar:function(t){return t.user.avatar},name:function(t){return t.user.name},introduction:function(t){return t.user.introduction},roles:function(t){return t.user.roles},permission_routes:function(t){return t.permission.routes},errorLogs:function(t){return t.errorLog.logs}}),c=o;a["default"].use(i["a"]);var r=n("c653"),s=r.keys().reduce((function(t,e){var n=e.replace(/^\.\/(.*)\.\w+$/,"$1"),a=r(e);return t[n]=a.default,t}),{}),l=new i["a"].Store({modules:s,getters:c});e["a"]=l},"48c1":function(t,e,n){},"4d49":function(t,e,n){"use strict";n.r(e);var a={logs:[]},i={ADD_ERROR_LOG:function(t,e){t.logs.push(e)},CLEAR_ERROR_LOG:function(t){t.logs.splice(0)}},o={addErrorLog:function(t,e){var n=t.commit;n("ADD_ERROR_LOG",e)},clearErrorLog:function(t){var e=t.commit;e("CLEAR_ERROR_LOG")}};e["default"]={namespaced:!0,state:a,mutations:i,actions:o}},"51ff":function(t,e,n){var a={"./404.svg":"a14a","./audit.svg":"d393","./dashboard2.svg":"ea93","./item4.svg":"f385","./item_logo4.svg":"8811","./json.svg":"2538","./language.svg":"2580","./lessee.svg":"dbd7","./link3.svg":"4213","./log3.svg":"6ba9","./notify.svg":"5448","./other4.svg":"119b","./pool3.svg":"a551","./tenant_logo2.svg":"1424","./threadPool_logo1.svg":"b6d1","./threadPool_logo2.svg":"9bc4","./user6.svg":"273d","./vessel3.svg":"6e71"};function i(t){var e=o(t);return n(e)}function o(t){var e=a[t];if(!(e+1)){var n=new Error("Cannot find module '"+t+"'");throw n.code="MODULE_NOT_FOUND",n}return e}i.keys=function(){return Object.keys(a)},i.resolve=o,t.exports=i,i.id="51ff"},5448:function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-notify",use:"icon-notify-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},"56d7":function(t,e,n){"use strict";n.r(e);var a={};n.r(a),n.d(a,"parseTime",(function(){return $["c"]})),n.d(a,"formatTime",(function(){return $["b"]})),n.d(a,"timeAgo",(function(){return R})),n.d(a,"numberFormatter",(function(){return P})),n.d(a,"toThousandFilter",(function(){return I})),n.d(a,"uppercaseFirst",(function(){return N}));n("456d"),n("ac6a"),n("cadf"),n("551c"),n("f751"),n("097d");var i=n("2b0e"),o=n("a78e"),c=n.n(o),r=(n("f5df"),n("5c96")),s=n.n(r),l=(n("24ab"),n("b20f"),function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{attrs:{id:"app"}},[n("router-view")],1)}),u=[],d={name:"App"},f=d,h=n("2877"),p=Object(h["a"])(f,l,u,!1,null,null,null),m=p.exports,v=n("4360"),b=n("a18c"),g=function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.isExternal?n("div",t._g({staticClass:"svg-external-icon svg-icon",style:t.styleExternalIcon},t.$listeners)):n("svg",t._g({class:t.svgClass,attrs:{"aria-hidden":"true"}},t.$listeners),[n("use",{attrs:{"xlink:href":t.iconName}})])},w=[],x=n("61f7"),y={name:"SvgIcon",props:{iconClass:{type:String,required:!0},className:{type:String,default:""}},computed:{isExternal:function(){return Object(x["a"])(this.iconClass)},iconName:function(){return"#icon-".concat(this.iconClass)},svgClass:function(){return this.className?"svg-icon "+this.className:"svg-icon"},styleExternalIcon:function(){return{mask:"url(".concat(this.iconClass,") no-repeat 50% 50%"),"-webkit-mask":"url(".concat(this.iconClass,") no-repeat 50% 50%")}}}},_=y,k=(n("64df"),Object(h["a"])(_,g,w,!1,null,"f9f7fefc",null)),M=k.exports;i["default"].component("svg-icon",M);var E=n("51ff"),z=function(t){return t.keys().map(t)};z(E);var C=n("c80c"),O=n("db72"),L=(n("96cf"),n("3b8d")),S=n("323e"),j=n.n(S),A=(n("a5d8"),n("5f87")),B=n("83d6"),H=n.n(B),T=H.a.title||"Vue Element Admin";function F(t){return t?"".concat(t," - ").concat(T):"".concat(T)}j.a.configure({showSpinner:!1});var V=["/login","/auth-redirect"];b["c"].beforeEach(function(){var t=Object(L["a"])(Object(C["a"])().mark((function t(e,n,a){var i,o,c,s,l;return Object(C["a"])().wrap((function(t){while(1)switch(t.prev=t.next){case 0:if(j.a.start(),document.title=F(e.meta.title),i=Object(A["a"])(),!i){t.next=35;break}if("/login"!==e.path){t.next=9;break}a({path:"/"}),j.a.done(),t.next=33;break;case 9:if(o=v["a"].getters.roles&&v["a"].getters.roles.length>0,!o){t.next=14;break}a(),t.next=33;break;case 14:return t.prev=14,t.next=17,v["a"].dispatch("user/getInfo");case 17:return c=t.sent,s=c.roles,t.next=21,v["a"].dispatch("permission/generateRoutes",s);case 21:l=t.sent,b["c"].addRoutes(l),a(Object(O["a"])(Object(O["a"])({},e),{},{replace:!0})),t.next=33;break;case 26:return t.prev=26,t.t0=t["catch"](14),t.next=30,v["a"].dispatch("user/resetToken");case 30:r["Message"].error(t.t0||"Has Error"),a("/login?redirect=".concat(e.path)),j.a.done();case 33:t.next=36;break;case 35:-1!==V.indexOf(e.path)?a():(a("/login?redirect=".concat(e.path)),j.a.done());case 36:case"end":return t.stop()}}),t,null,[[14,26]])})));return function(e,n,a){return t.apply(this,arguments)}}()),b["c"].afterEach((function(){j.a.done()}));n("6b54"),n("a481"),n("c5f6");var $=n("ed08");function D(t,e){return 1===t?t+e:t+e+"s"}function R(t){var e=Date.now()/1e3-Number(t);return e<3600?D(~~(e/60)," minute"):e<86400?D(~~(e/3600)," hour"):D(~~(e/86400)," day")}function P(t,e){for(var n=[{value:1e18,symbol:"E"},{value:1e15,symbol:"P"},{value:1e12,symbol:"T"},{value:1e9,symbol:"G"},{value:1e6,symbol:"M"},{value:1e3,symbol:"k"}],a=0;a=n[a].value)return(t/n[a].value+.1).toFixed(e).replace(/\.0+$|(\.[0-9]*[1-9])0+$/,"$1")+n[a].symbol;return t.toString()}function I(t){return(+t||0).toString().replace(/^-?\d+/g,(function(t){return t.replace(/(?=(?!\b)(\d{3})+$)/g,",")}))}function N(t){return t.charAt(0).toUpperCase()+t.slice(1)}var G=n("313e"),q=n("00e7"),U=n.n(q);i["default"].prototype.$echarts=G["default"],i["default"].prototype.$cookie=U.a,i["default"].use(s.a,{size:c.a.get("size")||"medium"}),Object.keys(a).forEach((function(t){i["default"].filter(t,a[t])})),i["default"].config.productionTip=!1,new i["default"]({el:"#app",router:b["c"],store:v["a"],render:function(t){return t(m)}})},"5e10":function(t,e,n){"use strict";n("3150")},"5f87":function(t,e,n){"use strict";n.d(e,"a",(function(){return c})),n.d(e,"c",(function(){return r})),n.d(e,"b",(function(){return s}));var a=n("a78e"),i=n.n(a),o="Admin-Token";function c(){return i.a.get(o)}function r(t){return i.a.set(o,t)}function s(){return i.a.remove(o)}},"61f7":function(t,e,n){"use strict";n.d(e,"a",(function(){return a}));n("6b54");function a(t){return/^(https?:|mailto:|tel:)/.test(t)}},"64df":function(t,e,n){"use strict";n("78bf")},6820:function(t,e,n){"use strict";n("4093")},"6ba9":function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-log3",use:"icon-log3-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},"6e71":function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-vessel3",use:"icon-vessel3-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},"78bf":function(t,e,n){},8326:function(t,e,n){},"83d6":function(t,e){t.exports={title:"Hippo4J Web",showSettings:!0,tagsView:!0,fixedHeader:!1,sidebarLogo:!0,errorLog:"production"}},8811:function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-item_logo4",use:"icon-item_logo4-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},"89f5":function(t,e,n){"use strict";n("29aa")},"8af8":function(t,e,n){"use strict";n("9c98")},"9bc4":function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-threadPool_logo2",use:"icon-threadPool_logo2-usage",viewBox:"0 0 1044 1024",content:''});c.a.add(r);e["default"]=r},"9c98":function(t,e,n){},a14a:function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-404",use:"icon-404-usage",viewBox:"0 0 128 128",content:''});c.a.add(r);e["default"]=r},a18c:function(t,e,n){"use strict";var a,i,o=n("2b0e"),c=n("8c4f"),r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"app-wrapper",class:t.classObj},["mobile"===t.device&&t.sidebar.opened?n("div",{staticClass:"drawer-bg",on:{click:t.handleClickOutside}}):t._e(),t._v(" "),n("sidebar",{staticClass:"sidebar-container"}),t._v(" "),n("div",{staticClass:"main-container"},[n("div",{class:{"fixed-header":t.fixedHeader}},[n("navbar")],1),t._v(" "),n("app-main")],1)],1)},s=[],l=n("db72"),u=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("section",{staticClass:"app-main"},[n("transition",{attrs:{name:"fade-transform",mode:"out-in"}},[n("router-view",{key:t.key})],1)],1)},d=[],f={name:"AppMain",computed:{cachedViews:function(){return this.$store.state.tagsView.cachedViews},key:function(){return this.$route.path}}},h=f,p=(n("5e10"),n("0d3d"),n("2877")),m=Object(p["a"])(h,u,d,!1,null,"5ad61798",null),v=m.exports,b=function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"navbar"},[a("hamburger",{staticClass:"hamburger-container",attrs:{id:"hamburger-container","is-active":t.sidebar.opened},on:{toggleClick:t.toggleSideBar}}),t._v(" "),a("breadcrumb",{staticClass:"breadcrumb-container",attrs:{id:"breadcrumb-container"}}),t._v(" "),a("div",{staticClass:"right-menu"},["mobile"!==t.device?void 0:t._e(),t._v(" "),a("el-dropdown",{staticClass:"avatar-container right-menu-item hover-effect",attrs:{trigger:"click"}},[a("div",{staticClass:"avatar-wrapper"},[a("img",{staticClass:"user-avatar",attrs:{src:n("f561")}}),t._v(" "),a("i",{staticClass:"el-icon-caret-bottom"})]),t._v(" "),a("el-dropdown-menu",{attrs:{slot:"dropdown"},slot:"dropdown"},[a("router-link",{attrs:{to:"/"}},[a("el-dropdown-item",[t._v("Dashboard")])],1),t._v(" "),a("el-dropdown-item",{attrs:{divided:""}},[a("span",{staticStyle:{display:"block"},on:{click:t.logout}},[t._v("Log Out")])])],1)],1)],2)],1)},g=[],w=n("c80c"),x=(n("96cf"),n("3b8d")),y=n("2f62"),_=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("el-breadcrumb",{staticClass:"app-breadcrumb",attrs:{separator:"/"}},[n("transition-group",{attrs:{name:"breadcrumb"}},t._l(t.levelList,(function(e,a){return n("el-breadcrumb-item",{key:e.path},["noRedirect"===e.redirect||a==t.levelList.length-1?n("span",{staticClass:"no-redirect"},[t._v(t._s(e.meta.title))]):n("a",{on:{click:function(n){return n.preventDefault(),t.handleLink(e)}}},[t._v(t._s(e.meta.title))])])})),1)],1)},k=[],M=(n("7f7f"),n("f559"),n("bd11")),E=n.n(M),z={data:function(){return{levelList:null}},watch:{$route:function(t){t.path.startsWith("/redirect/")||this.getBreadcrumb()}},created:function(){this.getBreadcrumb()},methods:{getBreadcrumb:function(){var t=this.$route.matched.filter((function(t){return t.meta&&t.meta.title})),e=t[0];this.isDashboard(e)||(t=[{path:"/dashboard",meta:{title:"Dashboard"}}].concat(t)),this.levelList=t.filter((function(t){return t.meta&&t.meta.title&&!1!==t.meta.breadcrumb}))},isDashboard:function(t){var e=t&&t.name;return!!e&&e.trim().toLocaleLowerCase()==="Dashboard".toLocaleLowerCase()},pathCompile:function(t){var e=this.$route.params,n=E.a.compile(t);return n(e)},handleLink:function(t){var e=t.redirect,n=t.path;e?this.$router.push(e):this.$router.push(this.pathCompile(n))}}},C=z,O=(n("89f5"),Object(p["a"])(C,_,k,!1,null,"1919fc1a",null)),L=O.exports,S=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticStyle:{padding:"0 15px"},on:{click:t.toggleClick}},[n("svg",{staticClass:"hamburger",class:{"is-active":t.isActive},attrs:{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg",width:"64",height:"64"}},[n("path",{attrs:{d:"M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z"}})])])},j=[],A={name:"Hamburger",props:{isActive:{type:Boolean,default:!1}},methods:{toggleClick:function(){this.$emit("toggleClick")}}},B=A,H=(n("d49d"),Object(p["a"])(B,S,j,!1,null,"49e15297",null)),T=H.exports,F=function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.errorLogs.length>0?n("div",[n("el-badge",{staticStyle:{"line-height":"25px","margin-top":"-5px"},attrs:{"is-dot":!0},nativeOn:{click:function(e){t.dialogTableVisible=!0}}},[n("el-button",{staticStyle:{padding:"8px 10px"},attrs:{size:"small",type:"danger"}},[n("svg-icon",{attrs:{"icon-class":"bug"}})],1)],1),t._v(" "),n("el-dialog",{attrs:{visible:t.dialogTableVisible,width:"80%","append-to-body":""},on:{"update:visible":function(e){t.dialogTableVisible=e}}},[n("div",{attrs:{slot:"title"},slot:"title"},[n("span",{staticStyle:{"padding-right":"10px"}},[t._v("Error Log")]),t._v(" "),n("el-button",{attrs:{size:"mini",type:"primary",icon:"el-icon-delete"},on:{click:t.clearAll}},[t._v("Clear All")])],1),t._v(" "),n("el-table",{attrs:{data:t.errorLogs,border:""}},[n("el-table-column",{attrs:{label:"Message"},scopedSlots:t._u([{key:"default",fn:function(e){var a=e.row;return[n("div",[n("span",{staticClass:"message-title"},[t._v("Msg:")]),t._v(" "),n("el-tag",{attrs:{type:"danger"}},[t._v("\n "+t._s(a.err.message)+"\n ")])],1),t._v(" "),n("br"),t._v(" "),n("div",[n("span",{staticClass:"message-title",staticStyle:{"padding-right":"10px"}},[t._v("Info: ")]),t._v(" "),n("el-tag",{attrs:{type:"warning"}},[t._v("\n "+t._s(a.vm.$vnode.tag)+" error in "+t._s(a.info)+"\n ")])],1),t._v(" "),n("br"),t._v(" "),n("div",[n("span",{staticClass:"message-title",staticStyle:{"padding-right":"16px"}},[t._v("Url: ")]),t._v(" "),n("el-tag",{attrs:{type:"success"}},[t._v("\n "+t._s(a.url)+"\n ")])],1)]}}],null,!1,3621415002)}),t._v(" "),n("el-table-column",{attrs:{label:"Stack"},scopedSlots:t._u([{key:"default",fn:function(e){return[t._v("\n "+t._s(e.row.err.stack)+"\n ")]}}],null,!1,1726869048)})],1)],1)],1):t._e()},V=[],$={name:"ErrorLog",data:function(){return{dialogTableVisible:!1}},computed:{errorLogs:function(){return this.$store.getters.errorLogs}},methods:{clearAll:function(){this.dialogTableVisible=!1,this.$store.dispatch("errorLog/clearErrorLog")}}},D=$,R=(n("b36c"),Object(p["a"])(D,F,V,!1,null,"be34583a",null)),P=R.exports,I={components:{Breadcrumb:L,Hamburger:T,ErrorLog:P},computed:Object(l["a"])({},Object(y["b"])(["sidebar","avatar","device"])),methods:{toggleSideBar:function(){this.$store.dispatch("app/toggleSideBar")},logout:function(){var t=Object(x["a"])(Object(w["a"])().mark((function t(){return Object(w["a"])().wrap((function(t){while(1)switch(t.prev=t.next){case 0:return this.$cookie.delete("userName"),t.next=3,this.$store.dispatch("user/logout");case 3:this.$router.push("/login?redirect=".concat(this.$route.fullPath));case 4:case"end":return t.stop()}}),t,this)})));function e(){return t.apply(this,arguments)}return e}()}},N=I,G=(n("07c6"),Object(p["a"])(N,b,g,!1,null,"6ab05616",null)),q=G.exports,U=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{class:{"has-logo":t.showLogo}},[t.showLogo?n("logo",{attrs:{collapse:t.isCollapse}}):t._e(),t._v(" "),n("el-scrollbar",{attrs:{"wrap-class":"scrollbar-wrapper"}},[n("el-menu",{attrs:{"default-active":t.activeMenu,collapse:t.isCollapse,"background-color":t.variables.menuBg,"text-color":t.variables.menuText,"unique-opened":!1,"active-text-color":t.variables.menuActiveText,"collapse-transition":!1,mode:"vertical"}},t._l(t.permission_routes,(function(t){return n("sidebar-item",{key:t.path,attrs:{item:t,"base-path":t.path}})})),1)],1)],1)},J=[],K=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"sidebar-logo-container",class:{collapse:t.collapse}},[n("transition",{attrs:{name:"sidebarLogoFade"}},[t.collapse?n("router-link",{key:"collapse",staticClass:"sidebar-logo-link",attrs:{to:"/"}},[t.logo?n("img",{staticClass:"sidebar-logo",attrs:{src:t.logo}}):n("h1",{staticClass:"sidebar-title"},[t._v(t._s(t.title))])]):n("router-link",{key:"expand",staticClass:"sidebar-logo-link",attrs:{to:"/"}},[t.logo?n("img",{staticClass:"sidebar-logo",attrs:{src:t.logo}}):t._e(),t._v(" "),n("h1",{staticClass:"sidebar-title"},[t._v(t._s(t.title))])])],1)],1)},Q=[],W={name:"SidebarLogo",props:{collapse:{type:Boolean,required:!0}},data:function(){return{title:"hippo4j 1.4.3"}}},Z=W,Y=(n("8af8"),Object(p["a"])(Z,K,Q,!1,null,"741ab93c",null)),X=Y.exports,tt=function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.item.hidden?t._e():n("div",{staticClass:"menu-wrapper"},[!t.hasOneShowingChild(t.item.children,t.item)||t.onlyOneChild.children&&!t.onlyOneChild.noShowingChildren||t.item.alwaysShow?n("el-submenu",{ref:"subMenu",attrs:{index:t.resolvePath(t.item.path),"popper-append-to-body":""}},[n("template",{slot:"title"},[t.item.meta?n("item",{attrs:{icon:t.item.meta&&t.item.meta.icon,title:t.item.meta.title}}):t._e()],1),t._v(" "),t._l(t.item.children,(function(e){return n("sidebar-item",{key:e.path,staticClass:"nest-menu",attrs:{"is-nest":!0,item:e,"base-path":t.resolvePath(e.path)}})}))],2):[t.onlyOneChild.meta?n("app-link",{attrs:{to:t.resolvePath(t.onlyOneChild.path)}},[n("el-menu-item",{class:{"submenu-title-noDropdown":!t.isNest},attrs:{index:t.resolvePath(t.onlyOneChild.path)}},[n("item",{attrs:{icon:t.onlyOneChild.meta.icon||t.item.meta&&t.item.meta.icon,title:t.onlyOneChild.meta.title}})],1)],1):t._e()]],2)},et=[],nt=n("df7c"),at=n.n(nt),it=n("61f7"),ot={name:"MenuItem",functional:!0,props:{icon:{type:String,default:""},title:{type:String,default:""}},render:function(t,e){var n=e.props,a=n.icon,i=n.title,o=[];return a&&o.push(t("svg-icon",{attrs:{"icon-class":a}})),i&&o.push(t("span",{slot:"title"},[i])),o}},ct=ot,rt=Object(p["a"])(ct,a,i,!1,null,null,null),st=rt.exports,lt=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("component",t._b({},"component",t.linkProps(t.to),!1),[t._t("default")],2)},ut=[],dt={props:{to:{type:String,required:!0}},methods:{linkProps:function(t){return Object(it["a"])(t)?{is:"a",href:t,target:"_blank",rel:"noopener"}:{is:"router-link",to:t}}}},ft=dt,ht=Object(p["a"])(ft,lt,ut,!1,null,null,null),pt=ht.exports,mt={computed:{device:function(){return this.$store.state.app.device}},mounted:function(){this.fixBugIniOS()},methods:{fixBugIniOS:function(){var t=this,e=this.$refs.subMenu;if(e){var n=e.handleMouseleave;e.handleMouseleave=function(e){"mobile"!==t.device&&n(e)}}}}},vt={name:"SidebarItem",components:{Item:st,AppLink:pt},mixins:[mt],props:{item:{type:Object,required:!0},isNest:{type:Boolean,default:!1},basePath:{type:String,default:""}},data:function(){return this.onlyOneChild=null,{}},methods:{hasOneShowingChild:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],n=arguments.length>1?arguments[1]:void 0,a=e.filter((function(e){return!e.hidden&&(t.onlyOneChild=e,!0)}));return 1===a.length||0===a.length&&(this.onlyOneChild=Object(l["a"])(Object(l["a"])({},n),{},{path:"",noShowingChildren:!0}),!0)},resolvePath:function(t){return Object(it["a"])(t)?t:Object(it["a"])(this.basePath)?this.basePath:at.a.resolve(this.basePath,t)}}},bt=vt,gt=Object(p["a"])(bt,tt,et,!1,null,null,null),wt=gt.exports,xt=n("cf1e"),yt=n.n(xt),_t={components:{SidebarItem:wt,Logo:X},computed:Object(l["a"])(Object(l["a"])({},Object(y["b"])(["permission_routes","sidebar"])),{},{activeMenu:function(){var t=this.$route,e=t.meta,n=t.path;return e.activeMenu?e.activeMenu:n},showLogo:function(){return this.$store.state.settings.sidebarLogo},variables:function(){return yt.a},isCollapse:function(){return!this.sidebar.opened}})},kt=_t,Mt=Object(p["a"])(kt,U,J,!1,null,null,null),Et=Mt.exports,zt=n("4360"),Ct=document,Ot=Ct.body,Lt=992,St={watch:{$route:function(t){"mobile"===this.device&&this.sidebar.opened&&zt["a"].dispatch("app/closeSideBar",{withoutAnimation:!1})}},beforeMount:function(){window.addEventListener("resize",this.$_resizeHandler)},beforeDestroy:function(){window.removeEventListener("resize",this.$_resizeHandler)},mounted:function(){var t=this.$_isMobile();t&&(zt["a"].dispatch("app/toggleDevice","mobile"),zt["a"].dispatch("app/closeSideBar",{withoutAnimation:!0}))},methods:{$_isMobile:function(){var t=Ot.getBoundingClientRect();return t.width-1'});c.a.add(r);e["default"]=r},b20f:function(t,e,n){t.exports={menuText:"#bfcbd9",menuActiveText:"#409eff",subMenuActiveText:"#f4f4f5",menuBg:"#304156",menuHover:"#263445",subMenuBg:"#1f2d3d",subMenuHover:"#001528",sideBarWidth:"210px"}},b36c:function(t,e,n){"use strict";n("187a")},b6d1:function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-threadPool_logo1",use:"icon-threadPool_logo1-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},b775:function(t,e,n){"use strict";var a=n("bc3a"),i=n.n(a),o=n("5c96"),c=n("4360"),r=n("5f87"),s=n("a18c"),l=i.a.create({baseURL:"",timeout:2e4});l.interceptors.request.use((function(t){return c["a"].getters.token&&(t.headers["Authorization"]=Object(r["a"])()),t}),(function(t){return console.log(t),Promise.reject(t)})),l.interceptors.response.use((function(t){var e=t.data;if("A000004"!==e.code){if("20000"!==e.code&&"0"!==e.code&&"200"!==e.code)return Object(o["Message"])({message:e.message||"Error",type:"error",duration:5e3}),"50008"!==e.code&&"50012"!==e.code&&"50014"!==e.code||o["MessageBox"].confirm("You have been logged out, you can cancel to stay on this page, or log in again","Confirm logout",{confirmButtonText:"Re-Login",cancelButtonText:"Cancel",type:"warning"}).then((function(){c["a"].dispatch("user/resetToken").then((function(){location.reload()}))})),Promise.reject(new Error(e.message||"Error"));var n=t.data,a=n.code;if("0"===a){var i=n.data;return i}return"200"===a?n:e}Object(r["b"])(),Object(s["d"])(),alert(e.message),document.location.href="index.html"}),(function(t){return console.log("err"+t),Object(o["Message"])({message:t.message,type:"error",duration:5e3}),Promise.reject(t)})),e["a"]=l},c653:function(t,e,n){var a={"./app.js":"d9cd","./errorLog.js":"4d49","./permission.js":"31c2","./settings.js":"0781","./user.js":"0f9a"};function i(t){var e=o(t);return n(e)}function o(t){var e=a[t];if(!(e+1)){var n=new Error("Cannot find module '"+t+"'");throw n.code="MODULE_NOT_FOUND",n}return e}i.keys=function(){return Object.keys(a)},i.resolve=o,t.exports=i,i.id="c653"},cf1e:function(t,e,n){t.exports={menuText:"#bfcbd9",menuActiveText:"#409eff",subMenuActiveText:"#f4f4f5",menuBg:"#304156",menuHover:"#263445",subMenuBg:"#1f2d3d",subMenuHover:"#001528",sideBarWidth:"210px"}},d393:function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-audit",use:"icon-audit-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},d49d:function(t,e,n){"use strict";n("8326")},d9cd:function(t,e,n){"use strict";n.r(e);var a=n("a78e"),i=n.n(a),o={sidebar:{opened:!i.a.get("sidebarStatus")||!!+i.a.get("sidebarStatus"),withoutAnimation:!1},device:"desktop",size:i.a.get("size")||"medium"},c={TOGGLE_SIDEBAR:function(t){t.sidebar.opened=!t.sidebar.opened,t.sidebar.withoutAnimation=!1,t.sidebar.opened?i.a.set("sidebarStatus",1):i.a.set("sidebarStatus",0)},CLOSE_SIDEBAR:function(t,e){i.a.set("sidebarStatus",0),t.sidebar.opened=!1,t.sidebar.withoutAnimation=e},TOGGLE_DEVICE:function(t,e){t.device=e},SET_SIZE:function(t,e){t.size=e,i.a.set("size",e)}},r={toggleSideBar:function(t){var e=t.commit;e("TOGGLE_SIDEBAR")},closeSideBar:function(t,e){var n=t.commit,a=e.withoutAnimation;n("CLOSE_SIDEBAR",a)},toggleDevice:function(t,e){var n=t.commit;n("TOGGLE_DEVICE",e)},setSize:function(t,e){var n=t.commit;n("SET_SIZE",e)}};e["default"]={namespaced:!0,state:o,mutations:c,actions:r}},dbd7:function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-lessee",use:"icon-lessee-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},ea93:function(t,e,n){"use strict";n.r(e);var a=n("e017"),i=n.n(a),o=n("21a1"),c=n.n(o),r=new i.a({id:"icon-dashboard2",use:"icon-dashboard2-usage",viewBox:"0 0 1024 1024",content:''});c.a.add(r);e["default"]=r},ed08:function(t,e,n){"use strict";n.d(e,"c",(function(){return i})),n.d(e,"b",(function(){return o})),n.d(e,"a",(function(){return c}));n("3b2b"),n("4917"),n("4f7f"),n("5df3"),n("1c4c"),n("28a5"),n("ac6a"),n("456d"),n("a481"),n("6b54");var a=n("7618");function i(t,e){if(0===arguments.length)return null;var n,i=e||"{y}-{m}-{d} {h}:{i}:{s}";"object"===Object(a["a"])(t)?n=t:("string"===typeof t&&/^[0-9]+$/.test(t)&&(t=parseInt(t)),"number"===typeof t&&10===t.toString().length&&(t*=1e3),n=new Date(t));var o={y:n.getFullYear(),m:n.getMonth()+1,d:n.getDate(),h:n.getHours(),i:n.getMinutes(),s:n.getSeconds(),a:n.getDay()},c=i.replace(/{(y|m|d|h|i|s|a)+}/g,(function(t,e){var n=o[e];return"a"===e?["日","一","二","三","四","五","六"][n]:(t.length>0&&n<10&&(n="0"+n),n||0)}));return c}function o(t,e){t=10===(""+t).length?1e3*parseInt(t):+t;var n=new Date(t),a=Date.now(),o=(a-n)/1e3;return o<30?"刚刚":o<3600?Math.ceil(o/60)+"分钟前":o<86400?Math.ceil(o/3600)+"小时前":o<172800?"1天前":e?i(t,e):n.getMonth()+1+"月"+n.getDate()+"日"+n.getHours()+"时"+n.getMinutes()+"分"}function c(t,e,n){var a,i,o,c,r,s=function s(){var l=+new Date-c;l0?a=setTimeout(s,e-l):(a=null,n||(r=t.apply(o,i),a||(o=i=null)))};return function(){for(var i=arguments.length,l=new Array(i),u=0;u'});c.a.add(r);e["default"]=r},f561:function(t,e,n){t.exports=n.p+"static/img/hippo4j.ecba1844.gif"}},[[0,"runtime","chunk-elementUI","chunk-libs"]]]);
\ No newline at end of file
diff --git a/hippo4j-server/hippo4j-console/src/main/resources/static/static/js/chunk-078a7535.61dbc5da.js b/hippo4j-server/hippo4j-console/src/main/resources/static/static/js/chunk-078a7535.61dbc5da.js
new file mode 100644
index 00000000..d5701286
--- /dev/null
+++ b/hippo4j-server/hippo4j-console/src/main/resources/static/static/js/chunk-078a7535.61dbc5da.js
@@ -0,0 +1 @@
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-078a7535"],{3737:function(e,t,i){"use strict";i.d(t,"c",(function(){return a})),i.d(t,"d",(function(){return l})),i.d(t,"a",(function(){return r})),i.d(t,"b",(function(){return o}));var n=i("b775");function a(e){return Object(n["a"])({url:"/hippo4j/v1/cs/item/query/page",method:"post",data:e})}function l(e){return Object(n["a"])({url:"/hippo4j/v1/cs/item/update",method:"post",data:e})}function r(e){return Object(n["a"])({url:"/hippo4j/v1/cs/item/save",method:"post",data:e})}function o(e){return Object(n["a"])({url:"/hippo4j/v1/cs/item/delete/"+e[0]+"/"+e[1],method:"delete"})}},"395c":function(e,t,i){"use strict";i.r(t);var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"app-container"},[i("div",{staticClass:"filter-container"},[i("el-select",{staticClass:"filter-item",staticStyle:{width:"220px"},attrs:{placeholder:"租户(必填)",filterable:""},on:{change:function(t){return e.tenantSelectList()}},model:{value:e.listQuery.tenantId,callback:function(t){e.$set(e.listQuery,"tenantId",t)},expression:"listQuery.tenantId"}},e._l(e.tenantOptions,(function(e){return i("el-option",{key:e.key,attrs:{label:e.display_name,value:e.key}})})),1),e._v(" "),i("el-select",{staticClass:"filter-item",staticStyle:{width:"220px"},attrs:{placeholder:"项目(必填)",filterable:""},on:{change:function(t){return e.itemSelectList()}},model:{value:e.listQuery.itemId,callback:function(t){e.$set(e.listQuery,"itemId",t)},expression:"listQuery.itemId"}},e._l(e.itemOptions,(function(e){return i("el-option",{key:e.key,attrs:{label:e.display_name,value:e.key}})})),1),e._v(" "),i("el-select",{staticClass:"filter-item",staticStyle:{width:"220px"},attrs:{placeholder:"线程池标识(必填)",filterable:""},model:{value:e.listQuery.threadPoolKey,callback:function(t){e.$set(e.listQuery,"threadPoolKey",t)},expression:"listQuery.threadPoolKey"}},e._l(e.threadPoolKeyOptions,(function(e){return i("el-option",{key:e.key,attrs:{label:e.display_name,value:e.key}})})),1),e._v(" "),i("el-button",{directives:[{name:"waves",rawName:"v-waves"}],staticClass:"filter-item",attrs:{type:"primary",icon:"el-icon-search"},on:{click:e.fetchData}},[e._v("\n 搜索\n ")]),e._v(" "),i("el-button",{directives:[{name:"waves",rawName:"v-waves"}],staticClass:"filter-item",staticStyle:{"margin-left":"10px"},attrs:{type:"primary",icon:"el-icon-refresh"},on:{click:e.refreshData}},[e._v("\n 重置\n ")])],1),e._v(" "),i("el-table",{directives:[{name:"loading",rawName:"v-loading",value:e.listLoading,expression:"listLoading"}],attrs:{data:e.list,"element-loading-text":"Loading",border:"",fit:"","max-height":"714","highlight-current-row":""}},[i("el-table-column",{attrs:{label:"序号",width:"95"},scopedSlots:e._u([{key:"default",fn:function(t){return[e._v(e._s(t.$index+1))]}}])}),e._v(" "),i("el-table-column",{attrs:{label:"实例标识",width:"260"},scopedSlots:e._u([{key:"default",fn:function(t){return[i("el-link",{attrs:{type:"primary",underline:!1}},[e._v(e._s(t.row.identify))])]}}])}),e._v(" "),i("el-table-column",{attrs:{label:"Active"},scopedSlots:e._u([{key:"default",fn:function(t){return[i("el-tag",{attrs:{type:e._f("statusFilter")(t.row.active)}},[e._v("\n "+e._s(t.row.active)+"\n ")])]}}])}),e._v(" "),i("el-table-column",{attrs:{label:"线程池标识"},scopedSlots:e._u([{key:"default",fn:function(t){return[e._v("\n "+e._s(t.row.threadPoolKey)+"\n ")]}}])}),e._v(" "),i("el-table-column",{attrs:{label:"核心线程"},scopedSlots:e._u([{key:"default",fn:function(t){return[i("el-link",{attrs:{type:"success",underline:!1}},[e._v(e._s(t.row.coreSize))])]}}])}),e._v(" "),i("el-table-column",{attrs:{label:"最大线程"},scopedSlots:e._u([{key:"default",fn:function(t){return[i("el-link",{attrs:{type:"danger",underline:!1}},[e._v(e._s(t.row.maximumSize))])]}}])}),e._v(" "),i("el-table-column",{attrs:{label:"操作",width:"180","class-name":"small-padding fixed-width"},scopedSlots:e._u([{key:"default",fn:function(t){var n=t.row;return[i("el-button",{attrs:{type:"text",size:"small"},on:{click:function(t){return e.handleUpdate(n)}}},[e._v(" 编辑 ")])]}}])})],1),e._v(" "),i("el-dialog",{attrs:{title:e.textMap[e.dialogStatus],visible:e.dialogFormVisible},on:{"update:visible":function(t){e.dialogFormVisible=t}}},[i("el-form",{ref:"dataForm",attrs:{rules:e.rules,model:e.temp,"label-position":"left","label-width":"110px"}},[i("el-form-item",{attrs:{label:"核心线程",prop:"coreSize"}},[[i("el-input-number",{attrs:{"controls-position":"right",min:1,max:9999},model:{value:e.temp.coreSize,callback:function(t){e.$set(e.temp,"coreSize",t)},expression:"temp.coreSize"}})]],2),e._v(" "),i("el-form-item",{attrs:{label:"最大线程",prop:"maximumSize"}},[[i("el-input-number",{attrs:{"controls-position":"right",min:1,max:9999},model:{value:e.temp.maximumSize,callback:function(t){e.$set(e.temp,"maximumSize",t)},expression:"temp.maximumSize"}})]],2),e._v(" "),i("el-form-item",{attrs:{label:"全部修改",prop:"allUpdate"}},[i("el-switch",{model:{value:e.temp.allUpdate,callback:function(t){e.$set(e.temp,"allUpdate",t)},expression:"temp.allUpdate"}})],1)],1),e._v(" "),i("div",{staticClass:"dialog-footer",attrs:{slot:"footer"},slot:"footer"},[i("el-button",{on:{click:function(t){e.dialogFormVisible=!1}}},[e._v(" 取消 ")]),e._v(" "),i("el-button",{attrs:{type:"primary"},on:{click:function(t){return e.updateData()}}},[e._v(" 确认 ")])],1)],1),e._v(" "),i("el-dialog",{attrs:{visible:e.dialogPluginVisible,title:"Reading statistics"},on:{"update:visible":function(t){e.dialogPluginVisible=t}}},[i("el-table",{staticStyle:{width:"100%"},attrs:{data:e.pluginData,border:"",fit:"","highlight-current-row":""}},[i("el-table-column",{attrs:{prop:"key",label:"Channel"}}),e._v(" "),i("el-table-column",{attrs:{prop:"pv",label:"Pv"}})],1),e._v(" "),i("span",{staticClass:"dialog-footer",attrs:{slot:"footer"},slot:"footer"},[i("el-button",{attrs:{type:"primary"},on:{click:function(t){e.dialogPvVisible=!1}}},[e._v("Confirm")])],1)],1)],1)},a=[],l=i("3737"),r=i("dd71"),o=i("4d85"),s=i("47ec"),u=i("6724"),d={name:"JobProject",directives:{waves:u["a"]},filters:{statusFilter:function(e){var t={DEV:"info",TEST:"success",UAT:"warning",PROD:"danger"};return t[e]}},data:function(){return{isRejectShow:!1,list:null,listLoading:!1,total:0,listQuery:{itemId:"",mark:"Hystrix",tenantId:"",threadPoolKey:""},pluginTypeOptions:["reader","writer"],dialogPluginVisible:!1,pluginData:[],dialogFormVisible:!1,runTimeTemp:{},typeOptions:[{key:"Dubbo",display_name:"Dubbo"},{key:"RocketMQ",display_name:"RocketMQ"},{key:"RocketMQSpringCloudStream",display_name:"RocketMQSpringCloudStream"},{key:"RabbitMQ",display_name:"RabbitMQ"},{key:"RabbitMQSpringCloudStream",display_name:"RabbitMQSpringCloudStream"}],tenantOptions:[],instanceDialogFormVisible:!1,threadPoolOptions:[],itemOptions:[],threadPoolKeyOptions:[],itemTempOptions:[],queueTypeOptions:[{key:1,display_name:"ArrayBlockingQueue"},{key:2,display_name:"LinkedBlockingQueue"},{key:3,display_name:"LinkedBlockingDeque"},{key:4,display_name:"SynchronousQueue"},{key:5,display_name:"LinkedTransferQueue"},{key:6,display_name:"PriorityBlockingQueue"},{key:9,display_name:"ResizableLinkedBlockingQueue (动态修改队列大小)"}],rejectedOptions:[{key:1,display_name:"CallerRunsPolicy"},{key:2,display_name:"AbortPolicy"},{key:3,display_name:"DiscardPolicy"},{key:4,display_name:"DiscardOldestPolicy"},{key:5,display_name:"RunsOldestTaskPolicy"},{key:6,display_name:"SyncPutQueuePolicy"},{key:99,display_name:"CustomRejectedPolicy(自定义 SPI 策略)"}],alarmTypes:[{key:1,display_name:"报警"},{key:0,display_name:"不报警"}],allowCoreThreadTimeOutTypes:[{key:1,display_name:"超时"},{key:0,display_name:"不超时"}],size:500,dialogStatus:"",textMap:{update:"Edit",create:"Create"},rules:{coreSize:[{required:!0,message:"this is required",trigger:"blur"}],maximumSize:[{required:!0,message:"this is required",trigger:"blur"}]},temp:{id:void 0,tenantId:"",itemId:"",rejectedType:null,allUpdate:"1",customRejectedType:null},visible:!0}},created:function(){this.initSelect()},methods:{onInput:function(){this.$forceUpdate()},fetchData:function(){var e=this;this.listQuery.mark?this.listQuery.tenantId?this.listQuery.itemId?this.listQuery.threadPoolKey?(this.listLoading=!0,s["a"](this.listQuery).then((function(t){null==t&&(e.listLoading=!1),e.list=t,e.listLoading=!1}))):this.$message.warning("线程池标识不允许为空"):this.$message.warning("项目不允许为空"):this.$message.warning("租户不允许为空"):this.$message.warning("线程池类型不允许为空")},initSelect:function(){var e=this;r["c"]({size:this.size}).then((function(t){for(var i=t.records,n=0;n {
- private final int containerSize = 1024;
+ private static final int CONTAINER_SIZE = 1024;
- private final ConcurrentHashMap>> registry = new ConcurrentHashMap(containerSize);
+ private final ConcurrentHashMap>> registry = new ConcurrentHashMap<>(CONTAINER_SIZE);
@Override
public List> listInstance(String appName) {
Map> appNameLeaseMap = registry.get(appName);
- if (CollectionUtils.isEmpty(appNameLeaseMap)) {
- return new ArrayList<>();
- }
- List> appNameLeaseList = new ArrayList<>();
- appNameLeaseMap.values().forEach(each -> appNameLeaseList.add(each));
- return appNameLeaseList;
+ return CollectionUtils.isEmpty(appNameLeaseMap) ? Collections.emptyList() : new ArrayList<>(appNameLeaseMap.values());
}
@Override
public void register(InstanceInfo registrant) {
Map> registerMap = registry.get(registrant.getAppName());
if (registerMap == null) {
- ConcurrentHashMap> registerNewMap = new ConcurrentHashMap(12);
+ ConcurrentHashMap> registerNewMap = new ConcurrentHashMap<>();
registerMap = registry.putIfAbsent(registrant.getAppName(), registerNewMap);
if (registerMap == null) {
registerMap = registerNewMap;
@@ -98,8 +95,11 @@ public class BaseInstanceRegistry implements InstanceRegistry {
String appName = instanceRenew.getAppName();
String instanceId = instanceRenew.getInstanceId();
Map> registryMap = registry.get(appName);
- Lease leaseToRenew;
- if (registryMap == null || (leaseToRenew = registryMap.get(instanceId)) == null) {
+ if (registryMap == null) {
+ return false;
+ }
+ Lease leaseToRenew = registryMap.get(instanceId);
+ if (leaseToRenew == null) {
return false;
}
leaseToRenew.renew();
@@ -111,20 +111,20 @@ public class BaseInstanceRegistry implements InstanceRegistry {
String appName = info.getAppName();
String instanceId = info.getInstanceId();
Map> leaseMap = registry.get(appName);
- if (CollectionUtils.isEmpty(leaseMap)) {
+ if (CollectionUtil.isNotEmpty(leaseMap)) {
+ Lease remove = leaseMap.remove(instanceId);
+ if (remove != null) {
+ log.info("Remove unhealthy node, node ID: {}", instanceId);
+ } else {
+ log.warn("Failed to remove unhealthy node, no instance found: {}", instanceId);
+ }
+ } else {
log.warn("Failed to remove unhealthy node, no application found: {}", appName);
- return;
- }
- Lease remove = leaseMap.remove(instanceId);
- if (remove == null) {
- log.warn("Failed to remove unhealthy node, no instance found: {}", instanceId);
- return;
}
- log.info("Remove unhealthy node, node ID: {}", instanceId);
}
public void evict(long additionalLeaseMs) {
- List> expiredLeases = new ArrayList();
+ List> expiredLeases = new ArrayList<>();
for (Map.Entry>> groupEntry : registry.entrySet()) {
Map> leaseMap = groupEntry.getValue();
if (leaseMap != null) {
@@ -146,7 +146,7 @@ public class BaseInstanceRegistry implements InstanceRegistry {
protected boolean internalCancel(String appName, String id, String identify) {
Map> registerMap = registry.get(appName);
- if (!CollectionUtils.isEmpty(registerMap)) {
+ if (CollectionUtil.isNotEmpty(registerMap)) {
registerMap.remove(id);
AbstractSubjectCenter.notify(AbstractSubjectCenter.SubjectType.CLEAR_CONFIG_CACHE, () -> identify);
log.info("Clean up unhealthy nodes. Node id: {}", id);
@@ -154,6 +154,9 @@ public class BaseInstanceRegistry implements InstanceRegistry {
return true;
}
+ /**
+ * EvictionTask
+ */
public class EvictionTask extends TimerTask {
private final AtomicLong lastExecutionNanosRef = new AtomicLong(0L);
@@ -177,7 +180,7 @@ public class BaseInstanceRegistry implements InstanceRegistry {
}
long elapsedMs = TimeUnit.NANOSECONDS.toMillis(currNanos - lastNanos);
long compensationTime = elapsedMs - EVICTION_INTERVAL_TIMER_IN_MS;
- return compensationTime <= 0L ? 0L : compensationTime;
+ return Math.max(compensationTime, 0L);
}
long getCurrentTimeNano() {
@@ -193,7 +196,7 @@ public class BaseInstanceRegistry implements InstanceRegistry {
.daemon(true)
.build());
- private final AtomicReference evictionTaskRef = new AtomicReference();
+ private final AtomicReference evictionTaskRef = new AtomicReference<>();
public void postInit() {
evictionTaskRef.set(new BaseInstanceRegistry.EvictionTask());
diff --git a/hippo4j-server/hippo4j-discovery/src/main/java/cn/hippo4j/discovery/core/Lease.java b/hippo4j-server/hippo4j-discovery/src/main/java/cn/hippo4j/discovery/core/Lease.java
index e604760b..0d796f9e 100644
--- a/hippo4j-server/hippo4j-discovery/src/main/java/cn/hippo4j/discovery/core/Lease.java
+++ b/hippo4j-server/hippo4j-discovery/src/main/java/cn/hippo4j/discovery/core/Lease.java
@@ -17,32 +17,19 @@
package cn.hippo4j.discovery.core;
+import lombok.Getter;
+
/**
* Lease.
*/
public class Lease {
- enum Action {
- /**
- * REGISTER
- */
- REGISTER,
-
- /**
- * CANCEL
- */
- CANCEL,
-
- /**
- * RENEW
- */
- RENEW
- }
-
private T holder;
+ @Getter
private long evictionTimestamp;
+ @Getter
private long registrationTimestamp;
private long serviceUpTimestamp;
@@ -50,17 +37,18 @@ public class Lease {
/**
* Make it volatile so that the expiration task would see this quicker
*/
+ @Getter
private volatile long lastUpdateTimestamp;
private long duration;
- public static final int DEFAULT_DURATION_IN_SECS = 90;
+ public static final long DEFAULT_DURATION_IN_SECS = 90 * 1000L;
public Lease(T r) {
holder = r;
registrationTimestamp = System.currentTimeMillis();
lastUpdateTimestamp = registrationTimestamp;
- duration = DEFAULT_DURATION_IN_SECS * 1000;
+ duration = DEFAULT_DURATION_IN_SECS;
}
public void renew() {
@@ -91,18 +79,6 @@ public class Lease {
return (evictionTimestamp > 0 || System.currentTimeMillis() > (lastUpdateTimestamp + additionalLeaseMs));
}
- public long getRegistrationTimestamp() {
- return registrationTimestamp;
- }
-
- public long getLastRenewalTimestamp() {
- return lastUpdateTimestamp;
- }
-
- public long getEvictionTimestamp() {
- return evictionTimestamp;
- }
-
public long getServiceUpTimestamp() {
return serviceUpTimestamp;
}
diff --git a/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/pom.xml b/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/pom.xml
index abf69151..837a1f3b 100644
--- a/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/pom.xml
+++ b/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/pom.xml
@@ -22,6 +22,12 @@
cn.hippo4jhippo4j-core
+ ${revision}
+
+
+ cn.hippo4j
+ hippo4j-message
+ ${revision}com.alibaba.nacos
@@ -39,21 +45,18 @@
com.ctrip.framework.apolloapollo-client${apollo.version}
- compiletrueorg.apache.curatorcurator-framework${curator-framework.version}
- compiletrueio.etcdjetcd-core${jetcd.version}
- compiletrue
@@ -104,6 +107,7 @@
cn.hippo4jhippo4j-adapter-base
+ ${revision}cn.hippo4j
diff --git a/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/src/main/java/cn/hippo4j/config/springboot/starter/config/DynamicThreadPoolAutoConfiguration.java b/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/src/main/java/cn/hippo4j/config/springboot/starter/config/DynamicThreadPoolAutoConfiguration.java
index b30b235c..6dcf8475 100644
--- a/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/src/main/java/cn/hippo4j/config/springboot/starter/config/DynamicThreadPoolAutoConfiguration.java
+++ b/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/src/main/java/cn/hippo4j/config/springboot/starter/config/DynamicThreadPoolAutoConfiguration.java
@@ -17,6 +17,8 @@
package cn.hippo4j.config.springboot.starter.config;
+import cn.hippo4j.common.api.ThreadPoolCheckAlarm;
+import cn.hippo4j.common.api.ThreadPoolConfigChange;
import cn.hippo4j.common.config.ApplicationContextHolder;
import cn.hippo4j.config.springboot.starter.monitor.ThreadPoolMonitorExecutor;
import cn.hippo4j.config.springboot.starter.notify.CoreNotifyConfigBuilder;
@@ -29,11 +31,12 @@ import cn.hippo4j.config.springboot.starter.support.DynamicThreadPoolConfigServi
import cn.hippo4j.config.springboot.starter.support.DynamicThreadPoolPostProcessor;
import cn.hippo4j.core.config.UtilAutoConfiguration;
import cn.hippo4j.core.enable.MarkerConfiguration;
-import cn.hippo4j.core.executor.ThreadPoolNotifyAlarmHandler;
import cn.hippo4j.core.handler.DynamicThreadPoolBannerHandler;
import cn.hippo4j.message.api.NotifyConfigBuilder;
import cn.hippo4j.message.config.MessageConfiguration;
import cn.hippo4j.message.service.AlarmControlHandler;
+import cn.hippo4j.message.service.DefaultThreadPoolCheckAlarmHandler;
+import cn.hippo4j.message.service.DefaultThreadPoolConfigChangeHandler;
import cn.hippo4j.message.service.Hippo4jBaseSendMessageService;
import cn.hippo4j.message.service.Hippo4jSendMessageService;
import cn.hippo4j.springboot.starter.adapter.web.WebAdapterConfiguration;
@@ -76,8 +79,15 @@ public class DynamicThreadPoolAutoConfiguration {
}
@Bean
- public ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler(Hippo4jSendMessageService hippo4jSendMessageService) {
- return new ThreadPoolNotifyAlarmHandler(hippo4jSendMessageService);
+ @ConditionalOnMissingBean
+ public ThreadPoolCheckAlarm defaultThreadPoolCheckAlarmHandler(Hippo4jSendMessageService hippo4jSendMessageService) {
+ return new DefaultThreadPoolCheckAlarmHandler(hippo4jSendMessageService);
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ public ThreadPoolConfigChange defaultThreadPoolConfigChangeHandler(Hippo4jSendMessageService hippo4jSendMessageService) {
+ return new DefaultThreadPoolConfigChangeHandler(hippo4jSendMessageService);
}
@Bean
@@ -92,10 +102,10 @@ public class DynamicThreadPoolAutoConfiguration {
@Bean
@SuppressWarnings("all")
- public DynamicThreadPoolRefreshListener hippo4jExecutorsListener(ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler,
+ public DynamicThreadPoolRefreshListener hippo4jExecutorsListener(ThreadPoolConfigChange threadPoolConfigChange,
CoreNotifyConfigBuilder coreNotifyConfigBuilder,
Hippo4jBaseSendMessageService hippoBaseSendMessageService) {
- return new DynamicThreadPoolRefreshListener(threadPoolNotifyAlarmHandler, coreNotifyConfigBuilder, hippoBaseSendMessageService);
+ return new DynamicThreadPoolRefreshListener(threadPoolConfigChange, coreNotifyConfigBuilder, hippoBaseSendMessageService);
}
@Bean
diff --git a/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/src/main/java/cn/hippo4j/config/springboot/starter/monitor/ThreadPoolMonitorExecutor.java b/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/src/main/java/cn/hippo4j/config/springboot/starter/monitor/ThreadPoolMonitorExecutor.java
index 8d87c0c3..286db868 100644
--- a/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/src/main/java/cn/hippo4j/config/springboot/starter/monitor/ThreadPoolMonitorExecutor.java
+++ b/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/src/main/java/cn/hippo4j/config/springboot/starter/monitor/ThreadPoolMonitorExecutor.java
@@ -28,6 +28,7 @@ import cn.hippo4j.monitor.base.DynamicThreadPoolMonitor;
import cn.hippo4j.monitor.base.ThreadPoolMonitor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.DisposableBean;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
@@ -35,6 +36,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
+import java.util.Optional;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@@ -45,11 +47,11 @@ import static cn.hippo4j.core.executor.manage.GlobalThreadPoolManage.getThreadPo
*/
@Slf4j
@RequiredArgsConstructor
-public class ThreadPoolMonitorExecutor implements ApplicationRunner {
+public class ThreadPoolMonitorExecutor implements ApplicationRunner, DisposableBean {
private final BootstrapConfigProperties properties;
- private ScheduledThreadPoolExecutor collectExecutor;
+ private ScheduledThreadPoolExecutor collectScheduledExecutor;
private List threadPoolMonitors;
@@ -64,7 +66,7 @@ public class ThreadPoolMonitorExecutor implements ApplicationRunner {
}
log.info("Start monitoring the running status of dynamic thread pool.");
threadPoolMonitors = new ArrayList<>();
- collectExecutor = new ScheduledThreadPoolExecutor(
+ collectScheduledExecutor = new ScheduledThreadPoolExecutor(
new Integer(1),
ThreadFactoryBuilder.builder().daemon(true).prefix("client.scheduled.collect.data").build());
// Get dynamic thread pool monitoring component.
@@ -74,7 +76,7 @@ public class ThreadPoolMonitorExecutor implements ApplicationRunner {
DynamicThreadPoolServiceLoader.getSingletonServiceInstances(DynamicThreadPoolMonitor.class);
dynamicThreadPoolMonitors.stream().filter(each -> collectTypes.contains(each.getType())).forEach(each -> threadPoolMonitors.add(each));
// Execute dynamic thread pool monitoring component.
- collectExecutor.scheduleWithFixedDelay(
+ collectScheduledExecutor.scheduleWithFixedDelay(
() -> scheduleRunnable(),
properties.getInitialDelay(),
properties.getCollectInterval(),
@@ -93,4 +95,9 @@ public class ThreadPoolMonitorExecutor implements ApplicationRunner {
}
}
}
+
+ @Override
+ public void destroy() throws Exception {
+ Optional.ofNullable(collectScheduledExecutor).ifPresent(each -> each.shutdown());
+ }
}
diff --git a/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/src/main/java/cn/hippo4j/config/springboot/starter/refresher/ZookeeperRefresherHandler.java b/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/src/main/java/cn/hippo4j/config/springboot/starter/refresher/ZookeeperRefresherHandler.java
index 0f01b047..00f6e6e5 100644
--- a/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/src/main/java/cn/hippo4j/config/springboot/starter/refresher/ZookeeperRefresherHandler.java
+++ b/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/src/main/java/cn/hippo4j/config/springboot/starter/refresher/ZookeeperRefresherHandler.java
@@ -17,11 +17,7 @@
package cn.hippo4j.config.springboot.starter.refresher;
-import java.nio.charset.StandardCharsets;
-import java.util.List;
-import java.util.Map;
-
-import cn.hippo4j.core.executor.manage.GlobalNotifyAlarmManage;
+import cn.hippo4j.message.service.GlobalNotifyAlarmManage;
import cn.hippo4j.message.service.ThreadPoolNotifyAlarm;
import lombok.extern.slf4j.Slf4j;
import org.apache.curator.framework.CuratorFramework;
@@ -35,6 +31,10 @@ import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.utils.ZKPaths;
import org.apache.zookeeper.WatchedEvent;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.Map;
+
/**
* Zookeeper refresher handler.
*/
diff --git a/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/DynamicThreadPoolRefreshListener.java b/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/DynamicThreadPoolRefreshListener.java
index 8f1e4a3b..fe30533c 100644
--- a/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/DynamicThreadPoolRefreshListener.java
+++ b/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/src/main/java/cn/hippo4j/config/springboot/starter/refresher/event/DynamicThreadPoolRefreshListener.java
@@ -17,6 +17,7 @@
package cn.hippo4j.config.springboot.starter.refresher.event;
+import cn.hippo4j.common.api.ThreadPoolConfigChange;
import cn.hippo4j.common.executor.support.BlockingQueueTypeEnum;
import cn.hippo4j.common.executor.support.RejectedPolicyTypeEnum;
import cn.hippo4j.common.executor.support.ResizableCapacityLinkedBlockingQueue;
@@ -26,18 +27,21 @@ import cn.hippo4j.config.springboot.starter.config.ExecutorProperties;
import cn.hippo4j.config.springboot.starter.notify.CoreNotifyConfigBuilder;
import cn.hippo4j.config.springboot.starter.support.GlobalCoreThreadPoolManage;
import cn.hippo4j.core.executor.DynamicThreadPoolExecutor;
-import cn.hippo4j.core.executor.ThreadPoolNotifyAlarmHandler;
-import cn.hippo4j.core.executor.manage.GlobalNotifyAlarmManage;
import cn.hippo4j.core.executor.manage.GlobalThreadPoolManage;
import cn.hippo4j.message.dto.NotifyConfigDTO;
import cn.hippo4j.message.request.ChangeParameterNotifyRequest;
+import cn.hippo4j.message.service.GlobalNotifyAlarmManage;
import cn.hippo4j.message.service.Hippo4jBaseSendMessageService;
import cn.hippo4j.message.service.ThreadPoolNotifyAlarm;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@@ -54,7 +58,7 @@ import static cn.hippo4j.config.springboot.starter.refresher.event.Hippo4jConfig
@Order(EXECUTORS_LISTENER)
public class DynamicThreadPoolRefreshListener extends AbstractRefreshListener {
- private final ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler;
+ private final ThreadPoolConfigChange threadPoolConfigChange;
private final CoreNotifyConfigBuilder coreNotifyConfigBuilder;
@@ -95,7 +99,7 @@ public class DynamicThreadPoolRefreshListener extends AbstractRefreshListener new RuntimeException("The thread pool id does not exist in the configuration."));
try {
- newDynamicPoolExecutor = buildNewDynamicThreadPool(executorProperties);
+ threadPoolParamReplace(executor, executorProperties);
} catch (Exception ex) {
- log.error("Failed to initialize thread pool configuration. error: {}", ex);
+ log.error("Failed to initialize thread pool configuration.", ex);
} finally {
- if (Objects.isNull(dynamicThreadPoolWrapper.getExecutor())) {
- dynamicThreadPoolWrapper.setExecutor(CommonDynamicThreadPoolProviderFactory.getInstance(threadPoolId));
- }
dynamicThreadPoolWrapper.setInitFlag(Boolean.TRUE);
}
ThreadPoolNotifyAlarm threadPoolNotifyAlarm = buildThreadPoolNotifyAlarm(executorProperties);
GlobalNotifyAlarmManage.put(threadPoolId, threadPoolNotifyAlarm);
- DynamicThreadPoolExecutor actualDynamicThreadPoolExecutor = (DynamicThreadPoolExecutor) dynamicThreadPoolWrapper.getExecutor();
- TaskDecorator taskDecorator = actualDynamicThreadPoolExecutor.getTaskDecorator();
- ((DynamicThreadPoolExecutor) newDynamicPoolExecutor).setTaskDecorator(taskDecorator);
- long awaitTerminationMillis = actualDynamicThreadPoolExecutor.getAwaitTerminationMillis();
- boolean waitForTasksToCompleteOnShutdown = actualDynamicThreadPoolExecutor.isWaitForTasksToCompleteOnShutdown();
- ((DynamicThreadPoolExecutor) newDynamicPoolExecutor).setSupportParam(awaitTerminationMillis, waitForTasksToCompleteOnShutdown);
- dynamicThreadPoolWrapper.setExecutor(newDynamicPoolExecutor);
}
GlobalThreadPoolManage.registerPool(dynamicThreadPoolWrapper.getThreadPoolId(), dynamicThreadPoolWrapper);
GlobalCoreThreadPoolManage.register(
threadPoolId,
executorProperties == null
- ? buildExecutorProperties(threadPoolId, newDynamicPoolExecutor)
+ ? buildDefaultExecutorProperties(threadPoolId, executor)
: buildActualExecutorProperties(executorProperties));
- return newDynamicPoolExecutor;
+ return executor;
}
+ /**
+ * Build actual executor properties.
+ *
+ * @param executorProperties executor properties
+ * @return executor properties
+ */
private ExecutorProperties buildActualExecutorProperties(ExecutorProperties executorProperties) {
return Optional.ofNullable(configProperties.getDefaultExecutor()).map(each -> buildExecutorProperties(executorProperties)).orElse(executorProperties);
}
- private ExecutorProperties buildExecutorProperties(String threadPoolId, ThreadPoolExecutor executor) {
+ /**
+ * Build default executor properties.
+ *
+ * @param threadPoolId thread-pool id
+ * @param executor dynamic thread-pool executor
+ * @return executor properties
+ */
+ private ExecutorProperties buildDefaultExecutorProperties(String threadPoolId, ThreadPoolExecutor executor) {
ExecutorProperties executorProperties = new ExecutorProperties();
BlockingQueue blockingQueue = executor.getQueue();
int queueSize = blockingQueue.size();
@@ -160,23 +161,32 @@ public final class DynamicThreadPoolPostProcessor implements BeanPostProcessor {
return executorProperties;
}
- private ThreadPoolExecutor buildNewDynamicThreadPool(ExecutorProperties executorProperties) {
- String threadNamePrefix = executorProperties.getThreadNamePrefix();
- ExecutorProperties newExecutorProperties = buildExecutorProperties(executorProperties);
- ThreadPoolExecutor newDynamicPoolExecutor = ThreadPoolBuilder.builder()
- .threadPoolId(executorProperties.getThreadPoolId())
- .threadFactory(StringUtil.isNotBlank(threadNamePrefix) ? threadNamePrefix : executorProperties.getThreadPoolId())
- .poolThreadSize(newExecutorProperties.getCorePoolSize(), newExecutorProperties.getMaximumPoolSize())
- .workQueue(BlockingQueueTypeEnum.createBlockingQueue(newExecutorProperties.getBlockingQueue(), newExecutorProperties.getQueueCapacity()))
- .executeTimeOut(newExecutorProperties.getExecuteTimeOut())
- .keepAliveTime(newExecutorProperties.getKeepAliveTime(), TimeUnit.SECONDS)
- .rejected(RejectedPolicyTypeEnum.createPolicy(newExecutorProperties.getRejectedHandler()))
- .allowCoreThreadTimeOut(newExecutorProperties.getAllowCoreThreadTimeOut())
- .dynamicPool()
- .build();
- return newDynamicPoolExecutor;
+ /**
+ * Thread-pool param replace.
+ *
+ * @param executor dynamic thread-pool executor
+ * @param executorProperties executor properties
+ */
+ private void threadPoolParamReplace(ThreadPoolExecutor executor, ExecutorProperties executorProperties) {
+ BlockingQueue workQueue = BlockingQueueTypeEnum.createBlockingQueue(executorProperties.getBlockingQueue(), executorProperties.getQueueCapacity());
+ ReflectUtil.setFieldValue(executor, "workQueue", workQueue);
+ executor.setCorePoolSize(executorProperties.getCorePoolSize());
+ executor.setMaximumPoolSize(executorProperties.getMaximumPoolSize());
+ executor.setKeepAliveTime(executorProperties.getKeepAliveTime(), TimeUnit.SECONDS);
+ executor.allowCoreThreadTimeOut(executorProperties.getAllowCoreThreadTimeOut());
+ executor.setRejectedExecutionHandler(RejectedPolicyTypeEnum.createPolicy(executorProperties.getRejectedHandler()));
+ if (executor instanceof DynamicThreadPoolExecutor) {
+ Optional.ofNullable(executorProperties.getExecuteTimeOut())
+ .ifPresent(executeTimeOut -> ((DynamicThreadPoolExecutor) executor).setExecuteTimeOut(executeTimeOut));
+ }
}
+ /**
+ * Build executor properties.
+ *
+ * @param executorProperties executor properties
+ * @return executor properties
+ */
private ExecutorProperties buildExecutorProperties(ExecutorProperties executorProperties) {
ExecutorProperties newExecutorProperties = ExecutorProperties.builder()
.corePoolSize(Optional.ofNullable(executorProperties.getCorePoolSize())
@@ -201,6 +211,12 @@ public final class DynamicThreadPoolPostProcessor implements BeanPostProcessor {
return newExecutorProperties;
}
+ /**
+ * Build thread-pool notify alarm
+ *
+ * @param executorProperties executor properties
+ * @return thread-pool notify alarm
+ */
private ThreadPoolNotifyAlarm buildThreadPoolNotifyAlarm(ExecutorProperties executorProperties) {
DynamicThreadPoolNotifyProperties notify = Optional.ofNullable(executorProperties).map(ExecutorProperties::getNotify).orElse(null);
boolean isAlarm = Optional.ofNullable(executorProperties.getAlarm())
diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-kafka/pom.xml b/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-kafka/pom.xml
deleted file mode 100644
index 85b4f49d..00000000
--- a/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-kafka/pom.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
- 4.0.0
-
- cn.hippo4j
- hippo4j-spring-boot-starter-adapter
- ${revision}
-
- hippo4j-spring-boot-starter-adapter-kafka
-
-
-
- cn.hippo4j
- hippo4j-adapter-kafka
- ${revision}
-
-
-
diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-kafka/src/main/java/cn/hippo4j/springboot/starter/adapter/kafka/KafkaAdapterAutoConfiguration.java b/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-kafka/src/main/java/cn/hippo4j/springboot/starter/adapter/kafka/KafkaAdapterAutoConfiguration.java
deleted file mode 100644
index b362f0b4..00000000
--- a/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-kafka/src/main/java/cn/hippo4j/springboot/starter/adapter/kafka/KafkaAdapterAutoConfiguration.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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 cn.hippo4j.springboot.starter.adapter.kafka;
-
-import cn.hippo4j.adapter.kafka.KafkaThreadPoolAdapter;
-import cn.hippo4j.common.config.ApplicationContextHolder;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * Kafka adapter auto configuration.
- */
-@Configuration
-public class KafkaAdapterAutoConfiguration {
-
- @Bean
- @ConditionalOnMissingBean
- public ApplicationContextHolder simpleApplicationContextHolder() {
- return new ApplicationContextHolder();
- }
-
- @Bean
- @SuppressWarnings("all")
- @ConditionalOnProperty(name = "spring.kafka.bootstrap-servers")
- public KafkaThreadPoolAdapter kafkaMQThreadPoolAdapter(ApplicationContextHolder applicationContextHolder) {
- return new KafkaThreadPoolAdapter();
- }
-}
diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-kafka/src/main/resources/META-INF/spring.factories b/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-kafka/src/main/resources/META-INF/spring.factories
deleted file mode 100644
index 592fba93..00000000
--- a/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-kafka/src/main/resources/META-INF/spring.factories
+++ /dev/null
@@ -1 +0,0 @@
-org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.hippo4j.springboot.starter.adapter.kafka.KafkaAdapterAutoConfiguration
diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-rabbitmq/pom.xml b/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-rabbitmq/pom.xml
index ef170472..0ca029cc 100644
--- a/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-rabbitmq/pom.xml
+++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-rabbitmq/pom.xml
@@ -15,5 +15,10 @@
hippo4j-adapter-rabbitmq${revision}
+
+ org.springframework.boot
+ spring-boot-starter-amqp
+ true
+
diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-spring-cloud-stream-kafka/pom.xml b/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-spring-cloud-stream-kafka/pom.xml
deleted file mode 100644
index 85d57b0c..00000000
--- a/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-spring-cloud-stream-kafka/pom.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
- 4.0.0
-
- cn.hippo4j
- hippo4j-spring-boot-starter-adapter
- ${revision}
-
- hippo4j-spring-boot-starter-adapter-spring-cloud-stream-kafka
-
-
-
- cn.hippo4j
- hippo4j-adapter-spring-cloud-stream-kafka
- ${revision}
-
-
-
diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-spring-cloud-stream-kafka/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/kafka/SpringCloudStreamKafkaAdapterAutoConfiguration.java b/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-spring-cloud-stream-kafka/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/kafka/SpringCloudStreamKafkaAdapterAutoConfiguration.java
deleted file mode 100644
index cc8ddb6e..00000000
--- a/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-spring-cloud-stream-kafka/src/main/java/cn/hippo4j/springboot/starter/adapter/springcloud/stream/kafka/SpringCloudStreamKafkaAdapterAutoConfiguration.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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 cn.hippo4j.springboot.starter.adapter.springcloud.stream.kafka;
-
-import cn.hippo4j.adapter.springcloud.stream.kafka.SpringCloudStreamKafkaThreadPoolAdapter;
-import cn.hippo4j.common.config.ApplicationContextHolder;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * Spring cloud stream kafka adapter auto configuration.
- */
-@Configuration
-public class SpringCloudStreamKafkaAdapterAutoConfiguration {
-
- @Bean
- @ConditionalOnMissingBean
- public ApplicationContextHolder simpleApplicationContextHolder() {
- return new ApplicationContextHolder();
- }
-
- @Bean
- @SuppressWarnings("all")
- @ConditionalOnProperty(name = "xxx")
- public SpringCloudStreamKafkaThreadPoolAdapter springCloudStreamKafkaThreadPoolAdapter(ApplicationContextHolder applicationContextHolder) {
- return new SpringCloudStreamKafkaThreadPoolAdapter();
- }
-}
diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-spring-cloud-stream-kafka/src/main/resources/META-INF/spring.factories b/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-spring-cloud-stream-kafka/src/main/resources/META-INF/spring.factories
deleted file mode 100644
index 065332d1..00000000
--- a/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-spring-cloud-stream-kafka/src/main/resources/META-INF/spring.factories
+++ /dev/null
@@ -1 +0,0 @@
-org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.hippo4j.springboot.starter.adapter.springcloud.stream.kafka.SpringCloudStreamKafkaAdapterAutoConfiguration
diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rabbitmq/pom.xml b/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rabbitmq/pom.xml
index c6a049fc..c2d58f96 100644
--- a/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rabbitmq/pom.xml
+++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-spring-cloud-stream-rabbitmq/pom.xml
@@ -15,5 +15,11 @@
hippo4j-adapter-spring-cloud-stream-rabbitmq${revision}
+
+ org.springframework.cloud
+ spring-cloud-starter-stream-rabbit
+ ${spring-cloud-starter-stream-rabbitmq.version}
+ true
+
diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/pom.xml b/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/pom.xml
index 337ef55b..258c092e 100644
--- a/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/pom.xml
+++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/pom.xml
@@ -14,11 +14,9 @@
hippo4j-spring-boot-starter-adapter-allhippo4j-spring-boot-starter-adapter-dubbohippo4j-spring-boot-starter-adapter-alibaba-dubbo
- hippo4j-spring-boot-starter-adapter-kafkahippo4j-spring-boot-starter-adapter-rabbitmqhippo4j-spring-boot-starter-adapter-rocketmqhippo4j-spring-boot-starter-adapter-hystrix
- hippo4j-spring-boot-starter-adapter-spring-cloud-stream-kafkahippo4j-spring-boot-starter-adapter-spring-cloud-stream-rocketmqhippo4j-spring-boot-starter-adapter-spring-cloud-stream-rabbitmqhippo4j-spring-boot-starter-adapter-web
diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter/pom.xml b/hippo4j-spring-boot/hippo4j-spring-boot-starter/pom.xml
index 70131d65..5de5c2ee 100644
--- a/hippo4j-spring-boot/hippo4j-spring-boot-starter/pom.xml
+++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter/pom.xml
@@ -21,12 +21,18 @@
cn.hippo4jhippo4j-core
+ ${revision}cn.hippo4jhippo4j-common${revision}
+
+ cn.hippo4j
+ hippo4j-message
+ ${revision}
+ org.springframework.bootspring-boot-configuration-processor
@@ -36,39 +42,25 @@
org.projectlomboklombok
-
- com.aliyun
- alibaba-dingtalk-service-sdk
-
-
-
- log4j
- log4j
-
-
- org.springframework.bootspring-boot-starter-tomcat
- compiletrueorg.springframework.bootspring-boot-starter-jetty
- compiletrueorg.springframework.bootspring-boot-starter-undertow
- compiletruecn.hippo4jhippo4j-adapter-base
+ ${revision}io.netty
diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/config/DynamicThreadPoolAutoConfiguration.java b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/config/DynamicThreadPoolAutoConfiguration.java
index b950b423..5c1dee41 100644
--- a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/config/DynamicThreadPoolAutoConfiguration.java
+++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/config/DynamicThreadPoolAutoConfiguration.java
@@ -20,11 +20,12 @@ package cn.hippo4j.springboot.starter.config;
import cn.hippo4j.adapter.base.ThreadPoolAdapterBeanContainer;
import cn.hippo4j.adapter.web.WebThreadPoolHandlerChoose;
import cn.hippo4j.common.api.ThreadDetailState;
+import cn.hippo4j.common.api.ThreadPoolCheckAlarm;
+import cn.hippo4j.common.api.ThreadPoolConfigChange;
import cn.hippo4j.common.api.ThreadPoolDynamicRefresh;
import cn.hippo4j.common.config.ApplicationContextHolder;
import cn.hippo4j.core.config.UtilAutoConfiguration;
import cn.hippo4j.core.enable.MarkerConfiguration;
-import cn.hippo4j.core.executor.ThreadPoolNotifyAlarmHandler;
import cn.hippo4j.core.executor.state.ThreadPoolRunStateHandler;
import cn.hippo4j.core.executor.support.service.DynamicThreadPoolService;
import cn.hippo4j.core.handler.DynamicThreadPoolBannerHandler;
@@ -33,6 +34,8 @@ import cn.hippo4j.core.toolkit.inet.InetUtils;
import cn.hippo4j.message.api.NotifyConfigBuilder;
import cn.hippo4j.message.config.MessageConfiguration;
import cn.hippo4j.message.service.AlarmControlHandler;
+import cn.hippo4j.message.service.DefaultThreadPoolCheckAlarmHandler;
+import cn.hippo4j.message.service.DefaultThreadPoolConfigChangeHandler;
import cn.hippo4j.message.service.Hippo4jBaseSendMessageService;
import cn.hippo4j.message.service.Hippo4jSendMessageService;
import cn.hippo4j.springboot.starter.adapter.web.WebAdapterConfiguration;
@@ -56,6 +59,7 @@ import cn.hippo4j.springboot.starter.remote.ServerHealthCheck;
import cn.hippo4j.springboot.starter.remote.ServerHttpAgent;
import cn.hippo4j.springboot.starter.support.DynamicThreadPoolConfigService;
import cn.hippo4j.springboot.starter.support.DynamicThreadPoolPostProcessor;
+import cn.hippo4j.springboot.starter.support.ThreadPoolPluginRegisterPostProcessor;
import lombok.AllArgsConstructor;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
@@ -195,8 +199,20 @@ public class DynamicThreadPoolAutoConfiguration {
}
@Bean
- public ThreadPoolDynamicRefresh threadPoolDynamicRefresh(ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler) {
- return new ServerThreadPoolDynamicRefresh(threadPoolNotifyAlarmHandler);
+ @ConditionalOnMissingBean
+ public ThreadPoolCheckAlarm defaultThreadPoolCheckAlarmHandler(Hippo4jSendMessageService hippo4jSendMessageService) {
+ return new DefaultThreadPoolCheckAlarmHandler(hippo4jSendMessageService);
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ public ThreadPoolConfigChange defaultThreadPoolConfigChangeHandler(Hippo4jSendMessageService hippo4jSendMessageService) {
+ return new DefaultThreadPoolConfigChangeHandler(hippo4jSendMessageService);
+ }
+
+ @Bean
+ public ThreadPoolDynamicRefresh threadPoolDynamicRefresh(ThreadPoolConfigChange threadPoolConfigChange) {
+ return new ServerThreadPoolDynamicRefresh(threadPoolConfigChange);
}
@Bean
@@ -206,12 +222,13 @@ public class DynamicThreadPoolAutoConfiguration {
}
@Bean
- public ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler(Hippo4jSendMessageService hippo4jSendMessageService) {
- return new ThreadPoolNotifyAlarmHandler(hippo4jSendMessageService);
+ public HttpAgent httpAgent(BootstrapProperties properties) {
+ return new ServerHttpAgent(properties);
}
@Bean
- public HttpAgent httpAgent(BootstrapProperties properties) {
- return new ServerHttpAgent(properties);
+ public ThreadPoolPluginRegisterPostProcessor threadPoolPluginRegisterPostProcessor() {
+ return new ThreadPoolPluginRegisterPostProcessor();
}
+
}
diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/core/ServerThreadPoolDynamicRefresh.java b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/core/ServerThreadPoolDynamicRefresh.java
index 55e93559..0b9ba60d 100644
--- a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/core/ServerThreadPoolDynamicRefresh.java
+++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/core/ServerThreadPoolDynamicRefresh.java
@@ -17,6 +17,7 @@
package cn.hippo4j.springboot.starter.core;
+import cn.hippo4j.common.api.ThreadPoolConfigChange;
import cn.hippo4j.common.api.ThreadPoolDynamicRefresh;
import cn.hippo4j.common.enums.EnableEnum;
import cn.hippo4j.common.executor.support.BlockingQueueTypeEnum;
@@ -26,7 +27,6 @@ import cn.hippo4j.common.model.ThreadPoolParameter;
import cn.hippo4j.common.model.ThreadPoolParameterInfo;
import cn.hippo4j.common.toolkit.JSONUtil;
import cn.hippo4j.core.executor.DynamicThreadPoolExecutor;
-import cn.hippo4j.core.executor.ThreadPoolNotifyAlarmHandler;
import cn.hippo4j.core.executor.manage.GlobalThreadPoolManage;
import cn.hippo4j.message.request.ChangeParameterNotifyRequest;
import lombok.AllArgsConstructor;
@@ -48,7 +48,7 @@ import static cn.hippo4j.common.constant.ChangeThreadPoolConstants.CHANGE_THREAD
@AllArgsConstructor
public class ServerThreadPoolDynamicRefresh implements ThreadPoolDynamicRefresh {
- private final ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler;
+ private final ThreadPoolConfigChange threadPoolConfigChange;
@Override
public void dynamicRefresh(String content) {
@@ -95,7 +95,7 @@ public class ServerThreadPoolDynamicRefresh implements ThreadPoolDynamicRefresh
.nowExecuteTimeOut(executeTimeOut)
.build();
changeNotifyRequest.setThreadPoolId(threadPoolId);
- threadPoolNotifyAlarmHandler.sendPoolConfigChange(changeNotifyRequest);
+ threadPoolConfigChange.sendPoolConfigChange(changeNotifyRequest);
log.info(CHANGE_THREAD_POOL_TEXT,
threadPoolId,
String.format(CHANGE_DELIMITER, originalCoreSize, afterExecutor.getCorePoolSize()),
diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/support/DynamicThreadPoolConfigService.java b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/support/DynamicThreadPoolConfigService.java
index 96e8d717..663b07dc 100644
--- a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/support/DynamicThreadPoolConfigService.java
+++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/support/DynamicThreadPoolConfigService.java
@@ -27,21 +27,18 @@ import cn.hippo4j.common.toolkit.JSONUtil;
import cn.hippo4j.common.web.base.Result;
import cn.hippo4j.common.web.exception.ServiceException;
import cn.hippo4j.core.executor.DynamicThreadPoolWrapper;
-import cn.hippo4j.core.executor.manage.GlobalNotifyAlarmManage;
import cn.hippo4j.core.executor.manage.GlobalThreadPoolManage;
import cn.hippo4j.core.executor.support.service.AbstractDynamicThreadPoolService;
import cn.hippo4j.message.dto.NotifyConfigDTO;
+import cn.hippo4j.message.service.GlobalNotifyAlarmManage;
import cn.hippo4j.message.service.Hippo4jBaseSendMessageService;
import cn.hippo4j.message.service.ThreadPoolNotifyAlarm;
import cn.hippo4j.springboot.starter.config.BootstrapProperties;
-import cn.hippo4j.springboot.starter.core.ClientWorker;
import cn.hippo4j.springboot.starter.core.DynamicThreadPoolSubscribeConfig;
-import cn.hippo4j.springboot.starter.event.ApplicationRefreshedEvent;
import cn.hippo4j.springboot.starter.notify.ServerNotifyConfigBuilder;
import cn.hippo4j.springboot.starter.remote.HttpAgent;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.springframework.context.ApplicationListener;
import java.util.List;
import java.util.Map;
@@ -76,7 +73,7 @@ public class DynamicThreadPoolConfigService extends AbstractDynamicThreadPoolSer
}
private ThreadPoolExecutor registerExecutor(DynamicThreadPoolRegisterWrapper registerWrapper) {
- DynamicThreadPoolRegisterParameter registerParameter = registerWrapper.getDynamicThreadPoolRegisterParameter();
+ DynamicThreadPoolRegisterParameter registerParameter = registerWrapper.getParameter();
checkThreadPoolParameter(registerParameter);
String threadPoolId = registerParameter.getThreadPoolId();
try {
@@ -101,11 +98,11 @@ public class DynamicThreadPoolConfigService extends AbstractDynamicThreadPoolSer
}
private void subscribeConfig(DynamicThreadPoolRegisterWrapper registerWrapper) {
- dynamicThreadPoolSubscribeConfig.subscribeConfig(registerWrapper.getDynamicThreadPoolRegisterParameter().getThreadPoolId());
+ dynamicThreadPoolSubscribeConfig.subscribeConfig(registerWrapper.getParameter().getThreadPoolId());
}
private void putNotifyAlarmConfig(DynamicThreadPoolRegisterWrapper registerWrapper) {
- DynamicThreadPoolRegisterParameter registerParameter = registerWrapper.getDynamicThreadPoolRegisterParameter();
+ DynamicThreadPoolRegisterParameter registerParameter = registerWrapper.getParameter();
ThreadPoolNotifyAlarm threadPoolNotifyAlarm = new ThreadPoolNotifyAlarm(
BooleanUtil.toBoolean(String.valueOf(registerParameter.getIsAlarm())),
registerParameter.getActiveAlarm(),
diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/support/DynamicThreadPoolPostProcessor.java b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/support/DynamicThreadPoolPostProcessor.java
index 0d3006d8..62bbe59b 100644
--- a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/support/DynamicThreadPoolPostProcessor.java
+++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/support/DynamicThreadPoolPostProcessor.java
@@ -27,16 +27,15 @@ import cn.hippo4j.common.model.register.DynamicThreadPoolRegisterParameter;
import cn.hippo4j.common.model.register.DynamicThreadPoolRegisterWrapper;
import cn.hippo4j.common.toolkit.BooleanUtil;
import cn.hippo4j.common.toolkit.JSONUtil;
+import cn.hippo4j.common.toolkit.ReflectUtil;
import cn.hippo4j.common.web.base.Result;
import cn.hippo4j.core.executor.DynamicThreadPool;
import cn.hippo4j.core.executor.DynamicThreadPoolExecutor;
import cn.hippo4j.core.executor.DynamicThreadPoolWrapper;
-import cn.hippo4j.core.executor.manage.GlobalNotifyAlarmManage;
import cn.hippo4j.core.executor.manage.GlobalThreadPoolManage;
-import cn.hippo4j.core.executor.support.ThreadPoolBuilder;
import cn.hippo4j.core.executor.support.adpter.DynamicThreadPoolAdapterChoose;
-import cn.hippo4j.core.provider.CommonDynamicThreadPoolProviderFactory;
import cn.hippo4j.core.toolkit.DynamicThreadPoolAnnotationUtil;
+import cn.hippo4j.message.service.GlobalNotifyAlarmManage;
import cn.hippo4j.message.service.ThreadPoolNotifyAlarm;
import cn.hippo4j.springboot.starter.config.BootstrapProperties;
import cn.hippo4j.springboot.starter.core.DynamicThreadPoolSubscribeConfig;
@@ -45,7 +44,6 @@ import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
-import org.springframework.core.task.TaskDecorator;
import java.util.HashMap;
import java.util.Map;
@@ -114,7 +112,7 @@ public final class DynamicThreadPoolPostProcessor implements BeanPostProcessor {
/**
* Register and subscribe.
*
- * @param dynamicThreadPoolWrapper
+ * @param dynamicThreadPoolWrapper dynamic thread-pool wrapper
*/
protected void registerAndSubscribe(DynamicThreadPoolWrapper dynamicThreadPoolWrapper) {
fillPoolAndRegister(dynamicThreadPoolWrapper);
@@ -124,7 +122,7 @@ public final class DynamicThreadPoolPostProcessor implements BeanPostProcessor {
/**
* Fill the thread pool and register.
*
- * @param dynamicThreadPoolWrapper
+ * @param dynamicThreadPoolWrapper dynamic thread-pool wrapper
*/
protected ThreadPoolExecutor fillPoolAndRegister(DynamicThreadPoolWrapper dynamicThreadPoolWrapper) {
String threadPoolId = dynamicThreadPoolWrapper.getThreadPoolId();
@@ -133,42 +131,14 @@ public final class DynamicThreadPoolPostProcessor implements BeanPostProcessor {
queryStrMap.put(TP_ID, threadPoolId);
queryStrMap.put(ITEM_ID, properties.getItemId());
queryStrMap.put(NAMESPACE, properties.getNamespace());
- ThreadPoolExecutor newDynamicThreadPoolExecutor = null;
ThreadPoolParameterInfo threadPoolParameterInfo = new ThreadPoolParameterInfo();
try {
Result result = httpAgent.httpGetByConfig(Constants.CONFIG_CONTROLLER_PATH, null, queryStrMap, 5000L);
if (result.isSuccess() && result.getData() != null) {
String resultJsonStr = JSONUtil.toJSONString(result.getData());
if ((threadPoolParameterInfo = JSONUtil.parseObject(resultJsonStr, ThreadPoolParameterInfo.class)) != null) {
- // Create a thread pool with relevant parameters.
- BlockingQueue workQueue = BlockingQueueTypeEnum.createBlockingQueue(threadPoolParameterInfo.getQueueType(), threadPoolParameterInfo.getCapacity());
- newDynamicThreadPoolExecutor = ThreadPoolBuilder.builder()
- .dynamicPool()
- .threadPoolId(threadPoolId)
- .workQueue(workQueue)
- .threadFactory(executor.getThreadFactory())
- .poolThreadSize(threadPoolParameterInfo.corePoolSizeAdapt(), threadPoolParameterInfo.maximumPoolSizeAdapt())
- .keepAliveTime(threadPoolParameterInfo.getKeepAliveTime(), TimeUnit.SECONDS)
- .rejected(RejectedPolicyTypeEnum.createPolicy(threadPoolParameterInfo.getRejectedType()))
- .allowCoreThreadTimeOut(EnableEnum.getBool(threadPoolParameterInfo.getAllowCoreThreadTimeOut()))
- .build();
- // Set dynamic thread pool enhancement parameters.
- if (executor instanceof DynamicThreadPoolExecutor) {
- ThreadPoolNotifyAlarm threadPoolNotifyAlarm = new ThreadPoolNotifyAlarm(
- BooleanUtil.toBoolean(threadPoolParameterInfo.getIsAlarm().toString()),
- threadPoolParameterInfo.getLivenessAlarm(),
- threadPoolParameterInfo.getCapacityAlarm());
- GlobalNotifyAlarmManage.put(threadPoolId, threadPoolNotifyAlarm);
- TaskDecorator taskDecorator = ((DynamicThreadPoolExecutor) executor).getTaskDecorator();
- ((DynamicThreadPoolExecutor) newDynamicThreadPoolExecutor).setTaskDecorator(taskDecorator);
- long awaitTerminationMillis = ((DynamicThreadPoolExecutor) executor).getAwaitTerminationMillis();
- boolean waitForTasksToCompleteOnShutdown = ((DynamicThreadPoolExecutor) executor).isWaitForTasksToCompleteOnShutdown();
- ((DynamicThreadPoolExecutor) newDynamicThreadPoolExecutor).setSupportParam(awaitTerminationMillis, waitForTasksToCompleteOnShutdown);
- long executeTimeOut = Optional.ofNullable(threadPoolParameterInfo.getExecuteTimeOut())
- .orElse(((DynamicThreadPoolExecutor) executor).getExecuteTimeOut());
- ((DynamicThreadPoolExecutor) newDynamicThreadPoolExecutor).setExecuteTimeOut(executeTimeOut);
- }
- dynamicThreadPoolWrapper.setExecutor(newDynamicThreadPoolExecutor);
+ threadPoolParamReplace(executor, threadPoolParameterInfo);
+ registerNotifyAlarm(threadPoolParameterInfo);
}
} else {
// DynamicThreadPool configuration undefined in server
@@ -186,27 +156,55 @@ public final class DynamicThreadPoolPostProcessor implements BeanPostProcessor {
.rejectedPolicyType(RejectedPolicyTypeEnum.getRejectedPolicyTypeEnumByName(executor.getRejectedExecutionHandler().getClass().getSimpleName()))
.build();
DynamicThreadPoolRegisterWrapper registerWrapper = DynamicThreadPoolRegisterWrapper.builder()
- .dynamicThreadPoolRegisterParameter(parameterInfo)
+ .parameter(parameterInfo)
.build();
GlobalThreadPoolManage.dynamicRegister(registerWrapper);
}
} catch (Exception ex) {
- newDynamicThreadPoolExecutor = executor != null ? executor : CommonDynamicThreadPoolProviderFactory.getInstance(threadPoolId);
- dynamicThreadPoolWrapper.setExecutor(newDynamicThreadPoolExecutor);
log.error("Failed to initialize thread pool configuration. error message: {}", ex.getMessage());
- } finally {
- if (Objects.isNull(executor)) {
- dynamicThreadPoolWrapper.setExecutor(CommonDynamicThreadPoolProviderFactory.getInstance(threadPoolId));
- }
}
GlobalThreadPoolManage.register(dynamicThreadPoolWrapper.getThreadPoolId(), threadPoolParameterInfo, dynamicThreadPoolWrapper);
- return newDynamicThreadPoolExecutor;
+ return executor;
+ }
+
+ /**
+ * Thread-pool param replace.
+ *
+ * @param executor dynamic thread-pool executor
+ * @param threadPoolParameterInfo thread-pool parameter info
+ */
+ private void threadPoolParamReplace(ThreadPoolExecutor executor, ThreadPoolParameterInfo threadPoolParameterInfo) {
+ BlockingQueue workQueue = BlockingQueueTypeEnum.createBlockingQueue(threadPoolParameterInfo.getQueueType(), threadPoolParameterInfo.getCapacity());
+ ReflectUtil.setFieldValue(executor, "workQueue", workQueue);
+ executor.setCorePoolSize(threadPoolParameterInfo.corePoolSizeAdapt());
+ executor.setMaximumPoolSize(threadPoolParameterInfo.maximumPoolSizeAdapt());
+ executor.setKeepAliveTime(threadPoolParameterInfo.getKeepAliveTime(), TimeUnit.SECONDS);
+ executor.allowCoreThreadTimeOut(EnableEnum.getBool(threadPoolParameterInfo.getAllowCoreThreadTimeOut()));
+ executor.setRejectedExecutionHandler(RejectedPolicyTypeEnum.createPolicy(threadPoolParameterInfo.getRejectedType()));
+ if (executor instanceof DynamicThreadPoolExecutor) {
+ Optional.ofNullable(threadPoolParameterInfo.getExecuteTimeOut())
+ .ifPresent(executeTimeOut -> ((DynamicThreadPoolExecutor) executor).setExecuteTimeOut(executeTimeOut));
+ }
+ }
+
+ /**
+ * Register notify alarm.
+ *
+ * @param threadPoolParameterInfo thread-pool parameter info
+ */
+ private void registerNotifyAlarm(ThreadPoolParameterInfo threadPoolParameterInfo) {
+ // Set dynamic thread pool enhancement parameters.
+ ThreadPoolNotifyAlarm threadPoolNotifyAlarm = new ThreadPoolNotifyAlarm(
+ BooleanUtil.toBoolean(threadPoolParameterInfo.getIsAlarm().toString()),
+ threadPoolParameterInfo.getLivenessAlarm(),
+ threadPoolParameterInfo.getCapacityAlarm());
+ GlobalNotifyAlarmManage.put(threadPoolParameterInfo.getTpId(), threadPoolNotifyAlarm);
}
/**
* Client dynamic thread pool subscription server configuration.
*
- * @param dynamicThreadPoolWrapper
+ * @param dynamicThreadPoolWrapper dynamic thread-pool wrapper
*/
protected void subscribeConfig(DynamicThreadPoolWrapper dynamicThreadPoolWrapper) {
if (dynamicThreadPoolWrapper.isSubscribeFlag()) {
diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/support/ThreadPoolPluginRegisterPostProcessor.java b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/support/ThreadPoolPluginRegisterPostProcessor.java
new file mode 100644
index 00000000..6f48e8fc
--- /dev/null
+++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/springboot/starter/support/ThreadPoolPluginRegisterPostProcessor.java
@@ -0,0 +1,152 @@
+/*
+ * 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 cn.hippo4j.springboot.starter.support;
+
+import cn.hippo4j.common.toolkit.Assert;
+import cn.hippo4j.core.plugin.ThreadPoolPlugin;
+import cn.hippo4j.core.plugin.manager.DefaultGlobalThreadPoolPluginManager;
+import cn.hippo4j.core.plugin.manager.GlobalThreadPoolPluginManager;
+import cn.hippo4j.core.plugin.manager.ThreadPoolPluginRegistrar;
+import cn.hippo4j.core.plugin.manager.ThreadPoolPluginSupport;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.aop.framework.autoproxy.AutoProxyUtils;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.BeanInitializationException;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.context.ApplicationContextException;
+import org.springframework.context.ApplicationEventPublisherAware;
+import org.springframework.context.MessageSourceAware;
+import org.springframework.context.ResourceLoaderAware;
+
+import java.util.Objects;
+
+/**
+ *
The extension implementation of {@link GlobalThreadPoolPluginManager} and {@link BeanPostProcessor},
+ * used to register {@link ThreadPoolPlugin} for the bean initialization stage of the {@link ThreadPoolPluginSupport}.
+ *
+ *
NOTE:
+ * If the {@link ThreadPoolPlugin}, {@link ThreadPoolPluginRegistrar}, and {@link ThreadPoolPluginSupport} is set to lazy load,
+ * The processor will not perceive the bean unless the user actively triggers the initialization of the bean.
+ *
+ * @see ThreadPoolPluginSupport
+ * @see ThreadPoolPluginRegistrar
+ * @see ThreadPoolPlugin
+ * @see GlobalThreadPoolPluginManager
+ * @see DefaultGlobalThreadPoolPluginManager
+ */
+@Slf4j
+public class ThreadPoolPluginRegisterPostProcessor extends DefaultGlobalThreadPoolPluginManager implements BeanPostProcessor, ApplicationContextAware {
+
+ /**
+ * application context
+ */
+ private ConfigurableListableBeanFactory beanFactory;
+
+ /**
+ *
Post process bean, if bean is instance of {@link ThreadPoolPlugin},
+ * {@link ThreadPoolPluginRegistrar} or {@link ThreadPoolPluginSupport},
+ * then take beans as an available component and register to {@link GlobalThreadPoolPluginManager}.
+ *
+ * @param bean the new bean instance
+ * @param beanName the name of the bean
+ * @return the bean instance to use, either the original or a wrapped one;
+ * if {@code null}, no subsequent BeanPostProcessors will be invoked
+ * @throws BeansException in case of errors
+ * @see GlobalThreadPoolPluginManager#enableThreadPoolPlugin
+ * @see GlobalThreadPoolPluginManager#enableThreadPoolPluginRegistrar
+ * @see GlobalThreadPoolPluginManager#registerThreadPoolPluginSupport
+ */
+ @Override
+ public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
+ Class> beanType = null;
+ try {
+ beanType = AutoProxyUtils.determineTargetClass(beanFactory, beanName);
+ } catch (NoSuchBeanDefinitionException ex) {
+ if (log.isDebugEnabled()) {
+ log.debug("Could not resolve target class for bean with name '" + beanName + "'", ex);
+ }
+ }
+ if (Objects.isNull(beanType)) {
+ log.warn("cannot resolve type for bean [{}]", beanName);
+ return bean;
+ }
+
+ // register bean if necessary
+ registerThreadPoolPluginRegistrarIfNecessary(bean, beanType);
+ registerThreadPoolPluginIfNecessary(bean, beanType);
+ registerThreadPoolPluginSupportIfNecessary(bean, beanType);
+ return bean;
+ }
+
+ private void registerThreadPoolPluginSupportIfNecessary(Object bean, Class> beanType) {
+ if (ThreadPoolPluginSupport.class.isAssignableFrom(beanType)) {
+ ThreadPoolPluginSupport support = (ThreadPoolPluginSupport) bean;
+ if (registerThreadPoolPluginSupport(support) && log.isDebugEnabled()) {
+ log.info("register ThreadPoolPluginSupport [{}]", support.getThreadPoolId());
+ }
+ }
+ }
+
+ private void registerThreadPoolPluginIfNecessary(Object bean, Class> beanType) {
+ if (ThreadPoolPlugin.class.isAssignableFrom(beanType)) {
+ ThreadPoolPlugin plugin = (ThreadPoolPlugin) bean;
+ if (enableThreadPoolPlugin(plugin) && log.isDebugEnabled()) {
+ log.info("register ThreadPoolPlugin [{}]", plugin.getId());
+ }
+ }
+ }
+
+ private void registerThreadPoolPluginRegistrarIfNecessary(Object bean, Class> beanType) {
+ if (ThreadPoolPluginRegistrar.class.isAssignableFrom(beanType)) {
+ ThreadPoolPluginRegistrar registrar = (ThreadPoolPluginRegistrar) bean;
+ if (enableThreadPoolPluginRegistrar(registrar) && log.isDebugEnabled()) {
+ log.info("register ThreadPoolPluginRegistrar [{}]", registrar.getId());
+ }
+ }
+ }
+
+ /**
+ * Set the ApplicationContext that this object runs in.
+ * Normally this call will be used to initialize the object.
+ *
Invoked after population of normal bean properties but before an init callback such
+ * as {@link InitializingBean#afterPropertiesSet()}
+ * or a custom init-method. Invoked after {@link ResourceLoaderAware#setResourceLoader},
+ * {@link ApplicationEventPublisherAware#setApplicationEventPublisher} and
+ * {@link MessageSourceAware}, if applicable.
+ *
+ * @param applicationContext the ApplicationContext object to be used by this object
+ * @throws ApplicationContextException in case of context initialization errors
+ * @throws BeansException if thrown by application context methods
+ * @see BeanInitializationException
+ */
+ @Override
+ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+ AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
+ Assert.isTrue(
+ factory instanceof ConfigurableListableBeanFactory,
+ "factory cannot cast to ConfigurableListableBeanFactory");
+ this.beanFactory = (ConfigurableListableBeanFactory) factory;
+ }
+
+}
diff --git a/hippo4j-server/hippo4j-ui/.editorconfig b/hippo4j-ui/.editorconfig
similarity index 100%
rename from hippo4j-server/hippo4j-ui/.editorconfig
rename to hippo4j-ui/.editorconfig
diff --git a/hippo4j-server/hippo4j-ui/.env.development b/hippo4j-ui/.env.development
similarity index 100%
rename from hippo4j-server/hippo4j-ui/.env.development
rename to hippo4j-ui/.env.development
diff --git a/hippo4j-server/hippo4j-ui/.env.production b/hippo4j-ui/.env.production
similarity index 100%
rename from hippo4j-server/hippo4j-ui/.env.production
rename to hippo4j-ui/.env.production
diff --git a/hippo4j-server/hippo4j-ui/.env.staging b/hippo4j-ui/.env.staging
similarity index 100%
rename from hippo4j-server/hippo4j-ui/.env.staging
rename to hippo4j-ui/.env.staging
diff --git a/hippo4j-server/hippo4j-ui/.eslintignore b/hippo4j-ui/.eslintignore
similarity index 100%
rename from hippo4j-server/hippo4j-ui/.eslintignore
rename to hippo4j-ui/.eslintignore
diff --git a/hippo4j-server/hippo4j-ui/.eslintrc.js b/hippo4j-ui/.eslintrc.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/.eslintrc.js
rename to hippo4j-ui/.eslintrc.js
diff --git a/hippo4j-server/hippo4j-ui/.gitignore b/hippo4j-ui/.gitignore
similarity index 100%
rename from hippo4j-server/hippo4j-ui/.gitignore
rename to hippo4j-ui/.gitignore
diff --git a/hippo4j-server/hippo4j-ui/.prettierrc.js b/hippo4j-ui/.prettierrc.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/.prettierrc.js
rename to hippo4j-ui/.prettierrc.js
diff --git a/hippo4j-server/hippo4j-ui/.travis.yml b/hippo4j-ui/.travis.yml
similarity index 100%
rename from hippo4j-server/hippo4j-ui/.travis.yml
rename to hippo4j-ui/.travis.yml
diff --git a/hippo4j-server/hippo4j-ui/README.md b/hippo4j-ui/README.md
similarity index 100%
rename from hippo4j-server/hippo4j-ui/README.md
rename to hippo4j-ui/README.md
diff --git a/hippo4j-server/hippo4j-ui/babel.config.js b/hippo4j-ui/babel.config.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/babel.config.js
rename to hippo4j-ui/babel.config.js
diff --git a/hippo4j-server/hippo4j-ui/jest.config.js b/hippo4j-ui/jest.config.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/jest.config.js
rename to hippo4j-ui/jest.config.js
diff --git a/hippo4j-server/hippo4j-ui/package.json b/hippo4j-ui/package.json
similarity index 97%
rename from hippo4j-server/hippo4j-ui/package.json
rename to hippo4j-ui/package.json
index bbe30325..9adc89b8 100755
--- a/hippo4j-server/hippo4j-ui/package.json
+++ b/hippo4j-ui/package.json
@@ -59,6 +59,7 @@
"vue": "2.6.10",
"vue-cookie": "^1.1.4",
"vue-count-to": "1.0.13",
+ "vue-i18n": "^6.1.3",
"vue-router": "3.0.2",
"vue-splitpane": "1.0.4",
"vue2-jsoneditor": "^1.0.6",
@@ -68,7 +69,7 @@
"devDependencies": {
"@babel/core": "7.0.0",
"@babel/register": "7.0.0",
- "@vue/cli-plugin-babel": "3.5.3",
+ "@vue/cli-plugin-babel": "~4",
"@vue/cli-plugin-eslint": "3.5.1",
"@vue/cli-plugin-unit-jest": "3.5.3",
"@vue/cli-service": "3.5.3",
diff --git a/hippo4j-server/hippo4j-ui/plopfile.js b/hippo4j-ui/plopfile.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/plopfile.js
rename to hippo4j-ui/plopfile.js
diff --git a/hippo4j-server/hippo4j-ui/postcss.config.js b/hippo4j-ui/postcss.config.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/postcss.config.js
rename to hippo4j-ui/postcss.config.js
diff --git a/hippo4j-server/hippo4j-ui/public/favicon.ico b/hippo4j-ui/public/favicon.ico
similarity index 100%
rename from hippo4j-server/hippo4j-ui/public/favicon.ico
rename to hippo4j-ui/public/favicon.ico
diff --git a/hippo4j-server/hippo4j-ui/public/hippo4j.gif b/hippo4j-ui/public/hippo4j.gif
similarity index 100%
rename from hippo4j-server/hippo4j-ui/public/hippo4j.gif
rename to hippo4j-ui/public/hippo4j.gif
diff --git a/hippo4j-server/hippo4j-ui/public/index.html b/hippo4j-ui/public/index.html
similarity index 100%
rename from hippo4j-server/hippo4j-ui/public/index.html
rename to hippo4j-ui/public/index.html
diff --git a/hippo4j-server/hippo4j-ui/src/App.vue b/hippo4j-ui/src/App.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/App.vue
rename to hippo4j-ui/src/App.vue
diff --git a/hippo4j-server/hippo4j-ui/src/api/dashborad.js b/hippo4j-ui/src/api/dashborad.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/api/dashborad.js
rename to hippo4j-ui/src/api/dashborad.js
diff --git a/hippo4j-server/hippo4j-ui/src/api/hippo4j-adapterThreadPool.js b/hippo4j-ui/src/api/hippo4j-adapterThreadPool.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/api/hippo4j-adapterThreadPool.js
rename to hippo4j-ui/src/api/hippo4j-adapterThreadPool.js
diff --git a/hippo4j-server/hippo4j-ui/src/api/hippo4j-instance.js b/hippo4j-ui/src/api/hippo4j-instance.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/api/hippo4j-instance.js
rename to hippo4j-ui/src/api/hippo4j-instance.js
diff --git a/hippo4j-server/hippo4j-ui/src/api/hippo4j-item.js b/hippo4j-ui/src/api/hippo4j-item.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/api/hippo4j-item.js
rename to hippo4j-ui/src/api/hippo4j-item.js
diff --git a/hippo4j-server/hippo4j-ui/src/api/hippo4j-log.js b/hippo4j-ui/src/api/hippo4j-log.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/api/hippo4j-log.js
rename to hippo4j-ui/src/api/hippo4j-log.js
diff --git a/hippo4j-server/hippo4j-ui/src/api/hippo4j-monitor.js b/hippo4j-ui/src/api/hippo4j-monitor.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/api/hippo4j-monitor.js
rename to hippo4j-ui/src/api/hippo4j-monitor.js
diff --git a/hippo4j-server/hippo4j-ui/src/api/hippo4j-notify.js b/hippo4j-ui/src/api/hippo4j-notify.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/api/hippo4j-notify.js
rename to hippo4j-ui/src/api/hippo4j-notify.js
diff --git a/hippo4j-server/hippo4j-ui/src/api/hippo4j-tenant.js b/hippo4j-ui/src/api/hippo4j-tenant.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/api/hippo4j-tenant.js
rename to hippo4j-ui/src/api/hippo4j-tenant.js
diff --git a/hippo4j-server/hippo4j-ui/src/api/hippo4j-threadPool.js b/hippo4j-ui/src/api/hippo4j-threadPool.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/api/hippo4j-threadPool.js
rename to hippo4j-ui/src/api/hippo4j-threadPool.js
diff --git a/hippo4j-server/hippo4j-ui/src/api/hippo4j-user.js b/hippo4j-ui/src/api/hippo4j-user.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/api/hippo4j-user.js
rename to hippo4j-ui/src/api/hippo4j-user.js
diff --git a/hippo4j-server/hippo4j-ui/src/api/metadata-query.js b/hippo4j-ui/src/api/metadata-query.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/api/metadata-query.js
rename to hippo4j-ui/src/api/metadata-query.js
diff --git a/hippo4j-server/hippo4j-ui/src/api/remote-search.js b/hippo4j-ui/src/api/remote-search.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/api/remote-search.js
rename to hippo4j-ui/src/api/remote-search.js
diff --git a/hippo4j-server/hippo4j-ui/src/api/role.js b/hippo4j-ui/src/api/role.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/api/role.js
rename to hippo4j-ui/src/api/role.js
diff --git a/hippo4j-server/hippo4j-ui/src/api/user.js b/hippo4j-ui/src/api/user.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/api/user.js
rename to hippo4j-ui/src/api/user.js
diff --git a/hippo4j-server/hippo4j-ui/src/api/verify.js b/hippo4j-ui/src/api/verify.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/api/verify.js
rename to hippo4j-ui/src/api/verify.js
diff --git a/hippo4j-server/hippo4j-ui/src/assets/401_images/401.gif b/hippo4j-ui/src/assets/401_images/401.gif
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/assets/401_images/401.gif
rename to hippo4j-ui/src/assets/401_images/401.gif
diff --git a/hippo4j-server/hippo4j-ui/src/assets/404_images/404.png b/hippo4j-ui/src/assets/404_images/404.png
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/assets/404_images/404.png
rename to hippo4j-ui/src/assets/404_images/404.png
diff --git a/hippo4j-server/hippo4j-ui/src/assets/404_images/404_cloud.png b/hippo4j-ui/src/assets/404_images/404_cloud.png
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/assets/404_images/404_cloud.png
rename to hippo4j-ui/src/assets/404_images/404_cloud.png
diff --git a/hippo4j-server/hippo4j-ui/src/assets/custom-theme/fonts/element-icons.ttf b/hippo4j-ui/src/assets/custom-theme/fonts/element-icons.ttf
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/assets/custom-theme/fonts/element-icons.ttf
rename to hippo4j-ui/src/assets/custom-theme/fonts/element-icons.ttf
diff --git a/hippo4j-server/hippo4j-ui/src/assets/custom-theme/fonts/element-icons.woff b/hippo4j-ui/src/assets/custom-theme/fonts/element-icons.woff
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/assets/custom-theme/fonts/element-icons.woff
rename to hippo4j-ui/src/assets/custom-theme/fonts/element-icons.woff
diff --git a/hippo4j-server/hippo4j-ui/src/assets/custom-theme/index.css b/hippo4j-ui/src/assets/custom-theme/index.css
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/assets/custom-theme/index.css
rename to hippo4j-ui/src/assets/custom-theme/index.css
diff --git a/hippo4j-server/hippo4j-ui/src/components/BackToTop/index.vue b/hippo4j-ui/src/components/BackToTop/index.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/components/BackToTop/index.vue
rename to hippo4j-ui/src/components/BackToTop/index.vue
diff --git a/hippo4j-server/hippo4j-ui/src/components/Breadcrumb/index.vue b/hippo4j-ui/src/components/Breadcrumb/index.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/components/Breadcrumb/index.vue
rename to hippo4j-ui/src/components/Breadcrumb/index.vue
diff --git a/hippo4j-server/hippo4j-ui/src/components/Charts/Keyboard.vue b/hippo4j-ui/src/components/Charts/Keyboard.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/components/Charts/Keyboard.vue
rename to hippo4j-ui/src/components/Charts/Keyboard.vue
diff --git a/hippo4j-server/hippo4j-ui/src/components/Charts/LineMarker.vue b/hippo4j-ui/src/components/Charts/LineMarker.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/components/Charts/LineMarker.vue
rename to hippo4j-ui/src/components/Charts/LineMarker.vue
diff --git a/hippo4j-server/hippo4j-ui/src/components/Charts/MixChart.vue b/hippo4j-ui/src/components/Charts/MixChart.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/components/Charts/MixChart.vue
rename to hippo4j-ui/src/components/Charts/MixChart.vue
diff --git a/hippo4j-server/hippo4j-ui/src/components/Charts/mixins/resize.js b/hippo4j-ui/src/components/Charts/mixins/resize.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/components/Charts/mixins/resize.js
rename to hippo4j-ui/src/components/Charts/mixins/resize.js
diff --git a/hippo4j-server/hippo4j-ui/src/components/ErrorLog/index.vue b/hippo4j-ui/src/components/ErrorLog/index.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/components/ErrorLog/index.vue
rename to hippo4j-ui/src/components/ErrorLog/index.vue
diff --git a/hippo4j-server/hippo4j-ui/src/components/GithubCorner/index.vue b/hippo4j-ui/src/components/GithubCorner/index.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/components/GithubCorner/index.vue
rename to hippo4j-ui/src/components/GithubCorner/index.vue
diff --git a/hippo4j-server/hippo4j-ui/src/components/Hamburger/index.vue b/hippo4j-ui/src/components/Hamburger/index.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/components/Hamburger/index.vue
rename to hippo4j-ui/src/components/Hamburger/index.vue
diff --git a/hippo4j-server/hippo4j-ui/src/components/HeaderSearch/index.vue b/hippo4j-ui/src/components/HeaderSearch/index.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/components/HeaderSearch/index.vue
rename to hippo4j-ui/src/components/HeaderSearch/index.vue
diff --git a/hippo4j-server/hippo4j-ui/src/components/ImageCropper/index.vue b/hippo4j-ui/src/components/ImageCropper/index.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/components/ImageCropper/index.vue
rename to hippo4j-ui/src/components/ImageCropper/index.vue
diff --git a/hippo4j-server/hippo4j-ui/src/components/ImageCropper/utils/data2blob.js b/hippo4j-ui/src/components/ImageCropper/utils/data2blob.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/components/ImageCropper/utils/data2blob.js
rename to hippo4j-ui/src/components/ImageCropper/utils/data2blob.js
diff --git a/hippo4j-server/hippo4j-ui/src/components/ImageCropper/utils/effectRipple.js b/hippo4j-ui/src/components/ImageCropper/utils/effectRipple.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/components/ImageCropper/utils/effectRipple.js
rename to hippo4j-ui/src/components/ImageCropper/utils/effectRipple.js
diff --git a/hippo4j-server/hippo4j-ui/src/components/ImageCropper/utils/language.js b/hippo4j-ui/src/components/ImageCropper/utils/language.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/components/ImageCropper/utils/language.js
rename to hippo4j-ui/src/components/ImageCropper/utils/language.js
diff --git a/hippo4j-server/hippo4j-ui/src/components/ImageCropper/utils/mimes.js b/hippo4j-ui/src/components/ImageCropper/utils/mimes.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/components/ImageCropper/utils/mimes.js
rename to hippo4j-ui/src/components/ImageCropper/utils/mimes.js
diff --git a/hippo4j-server/hippo4j-ui/src/components/JsonEditor/index.vue b/hippo4j-ui/src/components/JsonEditor/index.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/components/JsonEditor/index.vue
rename to hippo4j-ui/src/components/JsonEditor/index.vue
diff --git a/hippo4j-server/hippo4j-ui/src/components/Pagination/index.vue b/hippo4j-ui/src/components/Pagination/index.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/components/Pagination/index.vue
rename to hippo4j-ui/src/components/Pagination/index.vue
diff --git a/hippo4j-server/hippo4j-ui/src/components/RightPanel/index.vue b/hippo4j-ui/src/components/RightPanel/index.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/components/RightPanel/index.vue
rename to hippo4j-ui/src/components/RightPanel/index.vue
diff --git a/hippo4j-server/hippo4j-ui/src/components/Screenfull/index.vue b/hippo4j-ui/src/components/Screenfull/index.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/components/Screenfull/index.vue
rename to hippo4j-ui/src/components/Screenfull/index.vue
diff --git a/hippo4j-server/hippo4j-ui/src/components/Sticky/index.vue b/hippo4j-ui/src/components/Sticky/index.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/components/Sticky/index.vue
rename to hippo4j-ui/src/components/Sticky/index.vue
diff --git a/hippo4j-server/hippo4j-ui/src/components/SvgIcon/index.vue b/hippo4j-ui/src/components/SvgIcon/index.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/components/SvgIcon/index.vue
rename to hippo4j-ui/src/components/SvgIcon/index.vue
diff --git a/hippo4j-server/hippo4j-ui/src/directive/clipboard/clipboard.js b/hippo4j-ui/src/directive/clipboard/clipboard.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/directive/clipboard/clipboard.js
rename to hippo4j-ui/src/directive/clipboard/clipboard.js
diff --git a/hippo4j-server/hippo4j-ui/src/directive/clipboard/index.js b/hippo4j-ui/src/directive/clipboard/index.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/directive/clipboard/index.js
rename to hippo4j-ui/src/directive/clipboard/index.js
diff --git a/hippo4j-server/hippo4j-ui/src/directive/el-drag-dialog/drag.js b/hippo4j-ui/src/directive/el-drag-dialog/drag.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/directive/el-drag-dialog/drag.js
rename to hippo4j-ui/src/directive/el-drag-dialog/drag.js
diff --git a/hippo4j-server/hippo4j-ui/src/directive/el-drag-dialog/index.js b/hippo4j-ui/src/directive/el-drag-dialog/index.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/directive/el-drag-dialog/index.js
rename to hippo4j-ui/src/directive/el-drag-dialog/index.js
diff --git a/hippo4j-server/hippo4j-ui/src/directive/el-table/adaptive.js b/hippo4j-ui/src/directive/el-table/adaptive.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/directive/el-table/adaptive.js
rename to hippo4j-ui/src/directive/el-table/adaptive.js
diff --git a/hippo4j-server/hippo4j-ui/src/directive/el-table/index.js b/hippo4j-ui/src/directive/el-table/index.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/directive/el-table/index.js
rename to hippo4j-ui/src/directive/el-table/index.js
diff --git a/hippo4j-server/hippo4j-ui/src/directive/permission/index.js b/hippo4j-ui/src/directive/permission/index.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/directive/permission/index.js
rename to hippo4j-ui/src/directive/permission/index.js
diff --git a/hippo4j-server/hippo4j-ui/src/directive/permission/permission.js b/hippo4j-ui/src/directive/permission/permission.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/directive/permission/permission.js
rename to hippo4j-ui/src/directive/permission/permission.js
diff --git a/hippo4j-server/hippo4j-ui/src/directive/sticky.js b/hippo4j-ui/src/directive/sticky.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/directive/sticky.js
rename to hippo4j-ui/src/directive/sticky.js
diff --git a/hippo4j-server/hippo4j-ui/src/directive/waves/index.js b/hippo4j-ui/src/directive/waves/index.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/directive/waves/index.js
rename to hippo4j-ui/src/directive/waves/index.js
diff --git a/hippo4j-server/hippo4j-ui/src/directive/waves/waves.css b/hippo4j-ui/src/directive/waves/waves.css
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/directive/waves/waves.css
rename to hippo4j-ui/src/directive/waves/waves.css
diff --git a/hippo4j-server/hippo4j-ui/src/directive/waves/waves.js b/hippo4j-ui/src/directive/waves/waves.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/directive/waves/waves.js
rename to hippo4j-ui/src/directive/waves/waves.js
diff --git a/hippo4j-server/hippo4j-ui/src/filters/index.js b/hippo4j-ui/src/filters/index.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/filters/index.js
rename to hippo4j-ui/src/filters/index.js
diff --git a/hippo4j-server/hippo4j-ui/src/icons/index.js b/hippo4j-ui/src/icons/index.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/icons/index.js
rename to hippo4j-ui/src/icons/index.js
diff --git a/hippo4j-server/hippo4j-ui/src/icons/svg/404.svg b/hippo4j-ui/src/icons/svg/404.svg
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/icons/svg/404.svg
rename to hippo4j-ui/src/icons/svg/404.svg
diff --git a/hippo4j-server/hippo4j-ui/src/icons/svg/audit.svg b/hippo4j-ui/src/icons/svg/audit.svg
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/icons/svg/audit.svg
rename to hippo4j-ui/src/icons/svg/audit.svg
diff --git a/hippo4j-server/hippo4j-ui/src/icons/svg/dashboard2.svg b/hippo4j-ui/src/icons/svg/dashboard2.svg
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/icons/svg/dashboard2.svg
rename to hippo4j-ui/src/icons/svg/dashboard2.svg
diff --git a/hippo4j-server/hippo4j-ui/src/icons/svg/item4.svg b/hippo4j-ui/src/icons/svg/item4.svg
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/icons/svg/item4.svg
rename to hippo4j-ui/src/icons/svg/item4.svg
diff --git a/hippo4j-server/hippo4j-ui/src/icons/svg/item_logo4.svg b/hippo4j-ui/src/icons/svg/item_logo4.svg
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/icons/svg/item_logo4.svg
rename to hippo4j-ui/src/icons/svg/item_logo4.svg
diff --git a/hippo4j-server/hippo4j-ui/src/icons/svg/json.svg b/hippo4j-ui/src/icons/svg/json.svg
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/icons/svg/json.svg
rename to hippo4j-ui/src/icons/svg/json.svg
diff --git a/hippo4j-server/hippo4j-ui/src/icons/svg/language.svg b/hippo4j-ui/src/icons/svg/language.svg
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/icons/svg/language.svg
rename to hippo4j-ui/src/icons/svg/language.svg
diff --git a/hippo4j-server/hippo4j-ui/src/icons/svg/lessee.svg b/hippo4j-ui/src/icons/svg/lessee.svg
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/icons/svg/lessee.svg
rename to hippo4j-ui/src/icons/svg/lessee.svg
diff --git a/hippo4j-server/hippo4j-ui/src/icons/svg/link3.svg b/hippo4j-ui/src/icons/svg/link3.svg
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/icons/svg/link3.svg
rename to hippo4j-ui/src/icons/svg/link3.svg
diff --git a/hippo4j-server/hippo4j-ui/src/icons/svg/log3.svg b/hippo4j-ui/src/icons/svg/log3.svg
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/icons/svg/log3.svg
rename to hippo4j-ui/src/icons/svg/log3.svg
diff --git a/hippo4j-server/hippo4j-ui/src/icons/svg/notify.svg b/hippo4j-ui/src/icons/svg/notify.svg
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/icons/svg/notify.svg
rename to hippo4j-ui/src/icons/svg/notify.svg
diff --git a/hippo4j-server/hippo4j-ui/src/icons/svg/other4.svg b/hippo4j-ui/src/icons/svg/other4.svg
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/icons/svg/other4.svg
rename to hippo4j-ui/src/icons/svg/other4.svg
diff --git a/hippo4j-server/hippo4j-ui/src/icons/svg/pool3.svg b/hippo4j-ui/src/icons/svg/pool3.svg
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/icons/svg/pool3.svg
rename to hippo4j-ui/src/icons/svg/pool3.svg
diff --git a/hippo4j-server/hippo4j-ui/src/icons/svg/tenant_logo2.svg b/hippo4j-ui/src/icons/svg/tenant_logo2.svg
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/icons/svg/tenant_logo2.svg
rename to hippo4j-ui/src/icons/svg/tenant_logo2.svg
diff --git a/hippo4j-server/hippo4j-ui/src/icons/svg/threadPool_logo1.svg b/hippo4j-ui/src/icons/svg/threadPool_logo1.svg
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/icons/svg/threadPool_logo1.svg
rename to hippo4j-ui/src/icons/svg/threadPool_logo1.svg
diff --git a/hippo4j-server/hippo4j-ui/src/icons/svg/threadPool_logo2.svg b/hippo4j-ui/src/icons/svg/threadPool_logo2.svg
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/icons/svg/threadPool_logo2.svg
rename to hippo4j-ui/src/icons/svg/threadPool_logo2.svg
diff --git a/hippo4j-server/hippo4j-ui/src/icons/svg/user6.svg b/hippo4j-ui/src/icons/svg/user6.svg
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/icons/svg/user6.svg
rename to hippo4j-ui/src/icons/svg/user6.svg
diff --git a/hippo4j-server/hippo4j-ui/src/icons/svg/vessel3.svg b/hippo4j-ui/src/icons/svg/vessel3.svg
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/icons/svg/vessel3.svg
rename to hippo4j-ui/src/icons/svg/vessel3.svg
diff --git a/hippo4j-server/hippo4j-ui/src/icons/svgo.yml b/hippo4j-ui/src/icons/svgo.yml
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/icons/svgo.yml
rename to hippo4j-ui/src/icons/svgo.yml
diff --git a/hippo4j-server/hippo4j-ui/src/layout/components/AppMain.vue b/hippo4j-ui/src/layout/components/AppMain.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/layout/components/AppMain.vue
rename to hippo4j-ui/src/layout/components/AppMain.vue
diff --git a/hippo4j-server/hippo4j-ui/src/layout/components/Navbar.vue b/hippo4j-ui/src/layout/components/Navbar.vue
similarity index 94%
rename from hippo4j-server/hippo4j-ui/src/layout/components/Navbar.vue
rename to hippo4j-ui/src/layout/components/Navbar.vue
index 612126a8..283431ff 100755
--- a/hippo4j-server/hippo4j-ui/src/layout/components/Navbar.vue
+++ b/hippo4j-ui/src/layout/components/Navbar.vue
@@ -18,7 +18,7 @@
-
+
+
+
+
diff --git a/hippo4j-server/hippo4j-ui/src/main.js b/hippo4j-ui/src/main.js
similarity index 92%
rename from hippo4j-server/hippo4j-ui/src/main.js
rename to hippo4j-ui/src/main.js
index 28d415d5..44f539b8 100755
--- a/hippo4j-server/hippo4j-ui/src/main.js
+++ b/hippo4j-ui/src/main.js
@@ -17,6 +17,7 @@ import './icons'; // icon
import './permission'; // permission control
// import './utils/error-log' // error log
+import i18n from '@/locale'
import * as filters from './filters'; // global filters
import echarts from 'echarts';
Vue.prototype.$echarts = echarts;
@@ -25,6 +26,7 @@ Vue.prototype.$cookie = cookie;
Vue.use(Element, {
size: Cookies.get('size') || 'medium', // set element-ui default size
+ i18n: (key, value) => i18n.t(key, value)
});
// register global utility filters
@@ -38,5 +40,6 @@ new Vue({
el: '#app',
router,
store,
+ i18n,
render: (h) => h(App),
});
diff --git a/hippo4j-server/hippo4j-ui/src/permission.js b/hippo4j-ui/src/permission.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/permission.js
rename to hippo4j-ui/src/permission.js
diff --git a/hippo4j-server/hippo4j-ui/src/router/index.js b/hippo4j-ui/src/router/index.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/router/index.js
rename to hippo4j-ui/src/router/index.js
diff --git a/hippo4j-server/hippo4j-ui/src/router/modules/tool.js b/hippo4j-ui/src/router/modules/tool.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/router/modules/tool.js
rename to hippo4j-ui/src/router/modules/tool.js
diff --git a/hippo4j-server/hippo4j-ui/src/settings.js b/hippo4j-ui/src/settings.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/settings.js
rename to hippo4j-ui/src/settings.js
diff --git a/hippo4j-server/hippo4j-ui/src/store/getters.js b/hippo4j-ui/src/store/getters.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/store/getters.js
rename to hippo4j-ui/src/store/getters.js
diff --git a/hippo4j-server/hippo4j-ui/src/store/index.js b/hippo4j-ui/src/store/index.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/store/index.js
rename to hippo4j-ui/src/store/index.js
diff --git a/hippo4j-server/hippo4j-ui/src/store/modules/app.js b/hippo4j-ui/src/store/modules/app.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/store/modules/app.js
rename to hippo4j-ui/src/store/modules/app.js
diff --git a/hippo4j-server/hippo4j-ui/src/store/modules/errorLog.js b/hippo4j-ui/src/store/modules/errorLog.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/store/modules/errorLog.js
rename to hippo4j-ui/src/store/modules/errorLog.js
diff --git a/hippo4j-server/hippo4j-ui/src/store/modules/permission.js b/hippo4j-ui/src/store/modules/permission.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/store/modules/permission.js
rename to hippo4j-ui/src/store/modules/permission.js
diff --git a/hippo4j-server/hippo4j-ui/src/store/modules/settings.js b/hippo4j-ui/src/store/modules/settings.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/store/modules/settings.js
rename to hippo4j-ui/src/store/modules/settings.js
diff --git a/hippo4j-server/hippo4j-ui/src/store/modules/user.js b/hippo4j-ui/src/store/modules/user.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/store/modules/user.js
rename to hippo4j-ui/src/store/modules/user.js
diff --git a/hippo4j-server/hippo4j-ui/src/styles/btn.scss b/hippo4j-ui/src/styles/btn.scss
similarity index 97%
rename from hippo4j-server/hippo4j-ui/src/styles/btn.scss
rename to hippo4j-ui/src/styles/btn.scss
index e6ba1a8e..8f47f2c0 100755
--- a/hippo4j-server/hippo4j-ui/src/styles/btn.scss
+++ b/hippo4j-ui/src/styles/btn.scss
@@ -1,4 +1,4 @@
-@import './variables.scss';
+@import 'variables';
@mixin colorBtn($color) {
background: $color;
diff --git a/hippo4j-server/hippo4j-ui/src/styles/element-ui.scss b/hippo4j-ui/src/styles/element-ui.scss
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/styles/element-ui.scss
rename to hippo4j-ui/src/styles/element-ui.scss
diff --git a/hippo4j-server/hippo4j-ui/src/styles/element-variables.scss b/hippo4j-ui/src/styles/element-variables.scss
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/styles/element-variables.scss
rename to hippo4j-ui/src/styles/element-variables.scss
diff --git a/hippo4j-server/hippo4j-ui/src/styles/index.scss b/hippo4j-ui/src/styles/index.scss
similarity index 94%
rename from hippo4j-server/hippo4j-ui/src/styles/index.scss
rename to hippo4j-ui/src/styles/index.scss
index a111be42..1fa21ba7 100755
--- a/hippo4j-server/hippo4j-ui/src/styles/index.scss
+++ b/hippo4j-ui/src/styles/index.scss
@@ -1,9 +1,9 @@
-@import './variables.scss';
-@import './mixin.scss';
-@import './transition.scss';
-@import './element-ui.scss';
-@import './sidebar.scss';
-@import './btn.scss';
+@import 'variables';
+@import 'mixin';
+@import 'transition';
+@import 'element-ui';
+@import 'sidebar';
+@import 'btn';
* {
padding: 0;
diff --git a/hippo4j-server/hippo4j-ui/src/styles/mixin.scss b/hippo4j-ui/src/styles/mixin.scss
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/styles/mixin.scss
rename to hippo4j-ui/src/styles/mixin.scss
diff --git a/hippo4j-server/hippo4j-ui/src/styles/sidebar.scss b/hippo4j-ui/src/styles/sidebar.scss
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/styles/sidebar.scss
rename to hippo4j-ui/src/styles/sidebar.scss
diff --git a/hippo4j-server/hippo4j-ui/src/styles/transition.scss b/hippo4j-ui/src/styles/transition.scss
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/styles/transition.scss
rename to hippo4j-ui/src/styles/transition.scss
diff --git a/hippo4j-server/hippo4j-ui/src/styles/variables.scss b/hippo4j-ui/src/styles/variables.scss
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/styles/variables.scss
rename to hippo4j-ui/src/styles/variables.scss
diff --git a/hippo4j-server/hippo4j-ui/src/utils/auth.js b/hippo4j-ui/src/utils/auth.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/utils/auth.js
rename to hippo4j-ui/src/utils/auth.js
diff --git a/hippo4j-server/hippo4j-ui/src/utils/clipboard.js b/hippo4j-ui/src/utils/clipboard.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/utils/clipboard.js
rename to hippo4j-ui/src/utils/clipboard.js
diff --git a/hippo4j-server/hippo4j-ui/src/utils/error-log.js b/hippo4j-ui/src/utils/error-log.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/utils/error-log.js
rename to hippo4j-ui/src/utils/error-log.js
diff --git a/hippo4j-server/hippo4j-ui/src/utils/get-page-title.js b/hippo4j-ui/src/utils/get-page-title.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/utils/get-page-title.js
rename to hippo4j-ui/src/utils/get-page-title.js
diff --git a/hippo4j-server/hippo4j-ui/src/utils/index.js b/hippo4j-ui/src/utils/index.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/utils/index.js
rename to hippo4j-ui/src/utils/index.js
diff --git a/hippo4j-server/hippo4j-ui/src/utils/open-window.js b/hippo4j-ui/src/utils/open-window.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/utils/open-window.js
rename to hippo4j-ui/src/utils/open-window.js
diff --git a/hippo4j-server/hippo4j-ui/src/utils/permission.js b/hippo4j-ui/src/utils/permission.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/utils/permission.js
rename to hippo4j-ui/src/utils/permission.js
diff --git a/hippo4j-server/hippo4j-ui/src/utils/request.js b/hippo4j-ui/src/utils/request.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/utils/request.js
rename to hippo4j-ui/src/utils/request.js
diff --git a/hippo4j-server/hippo4j-ui/src/utils/scroll-to.js b/hippo4j-ui/src/utils/scroll-to.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/utils/scroll-to.js
rename to hippo4j-ui/src/utils/scroll-to.js
diff --git a/hippo4j-server/hippo4j-ui/src/utils/validate.js b/hippo4j-ui/src/utils/validate.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/utils/validate.js
rename to hippo4j-ui/src/utils/validate.js
diff --git a/hippo4j-server/hippo4j-ui/src/views/dashboard/admin/components/BarChart.vue b/hippo4j-ui/src/views/dashboard/admin/components/BarChart.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/views/dashboard/admin/components/BarChart.vue
rename to hippo4j-ui/src/views/dashboard/admin/components/BarChart.vue
diff --git a/hippo4j-server/hippo4j-ui/src/views/dashboard/admin/components/BoxCard.vue b/hippo4j-ui/src/views/dashboard/admin/components/BoxCard.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/views/dashboard/admin/components/BoxCard.vue
rename to hippo4j-ui/src/views/dashboard/admin/components/BoxCard.vue
diff --git a/hippo4j-server/hippo4j-ui/src/views/dashboard/admin/components/LineChart.vue b/hippo4j-ui/src/views/dashboard/admin/components/LineChart.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/views/dashboard/admin/components/LineChart.vue
rename to hippo4j-ui/src/views/dashboard/admin/components/LineChart.vue
diff --git a/hippo4j-server/hippo4j-ui/src/views/dashboard/admin/components/PanelGroup.vue b/hippo4j-ui/src/views/dashboard/admin/components/PanelGroup.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/views/dashboard/admin/components/PanelGroup.vue
rename to hippo4j-ui/src/views/dashboard/admin/components/PanelGroup.vue
diff --git a/hippo4j-server/hippo4j-ui/src/views/dashboard/admin/components/PieChart.vue b/hippo4j-ui/src/views/dashboard/admin/components/PieChart.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/views/dashboard/admin/components/PieChart.vue
rename to hippo4j-ui/src/views/dashboard/admin/components/PieChart.vue
diff --git a/hippo4j-server/hippo4j-ui/src/views/dashboard/admin/components/RaddarChart.vue b/hippo4j-ui/src/views/dashboard/admin/components/RaddarChart.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/views/dashboard/admin/components/RaddarChart.vue
rename to hippo4j-ui/src/views/dashboard/admin/components/RaddarChart.vue
diff --git a/hippo4j-server/hippo4j-ui/src/views/dashboard/admin/components/TodoList/Todo.vue b/hippo4j-ui/src/views/dashboard/admin/components/TodoList/Todo.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/views/dashboard/admin/components/TodoList/Todo.vue
rename to hippo4j-ui/src/views/dashboard/admin/components/TodoList/Todo.vue
diff --git a/hippo4j-server/hippo4j-ui/src/views/dashboard/admin/components/TodoList/index.scss b/hippo4j-ui/src/views/dashboard/admin/components/TodoList/index.scss
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/views/dashboard/admin/components/TodoList/index.scss
rename to hippo4j-ui/src/views/dashboard/admin/components/TodoList/index.scss
diff --git a/hippo4j-server/hippo4j-ui/src/views/dashboard/admin/components/TodoList/index.vue b/hippo4j-ui/src/views/dashboard/admin/components/TodoList/index.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/views/dashboard/admin/components/TodoList/index.vue
rename to hippo4j-ui/src/views/dashboard/admin/components/TodoList/index.vue
diff --git a/hippo4j-server/hippo4j-ui/src/views/dashboard/admin/components/TransactionTable.vue b/hippo4j-ui/src/views/dashboard/admin/components/TransactionTable.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/views/dashboard/admin/components/TransactionTable.vue
rename to hippo4j-ui/src/views/dashboard/admin/components/TransactionTable.vue
diff --git a/hippo4j-server/hippo4j-ui/src/views/dashboard/admin/components/mixins/resize.js b/hippo4j-ui/src/views/dashboard/admin/components/mixins/resize.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/views/dashboard/admin/components/mixins/resize.js
rename to hippo4j-ui/src/views/dashboard/admin/components/mixins/resize.js
diff --git a/hippo4j-server/hippo4j-ui/src/views/dashboard/admin/index.vue b/hippo4j-ui/src/views/dashboard/admin/index.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/views/dashboard/admin/index.vue
rename to hippo4j-ui/src/views/dashboard/admin/index.vue
diff --git a/hippo4j-server/hippo4j-ui/src/views/dashboard/index.vue b/hippo4j-ui/src/views/dashboard/index.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/views/dashboard/index.vue
rename to hippo4j-ui/src/views/dashboard/index.vue
diff --git a/hippo4j-server/hippo4j-ui/src/views/error-page/401.vue b/hippo4j-ui/src/views/error-page/401.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/views/error-page/401.vue
rename to hippo4j-ui/src/views/error-page/401.vue
diff --git a/hippo4j-server/hippo4j-ui/src/views/error-page/404.vue b/hippo4j-ui/src/views/error-page/404.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/views/error-page/404.vue
rename to hippo4j-ui/src/views/error-page/404.vue
diff --git a/hippo4j-server/hippo4j-ui/src/views/hippo4j/instance/index.vue b/hippo4j-ui/src/views/hippo4j/instance/index.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/views/hippo4j/instance/index.vue
rename to hippo4j-ui/src/views/hippo4j/instance/index.vue
diff --git a/hippo4j-server/hippo4j-ui/src/views/hippo4j/item/index.vue b/hippo4j-ui/src/views/hippo4j/item/index.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/views/hippo4j/item/index.vue
rename to hippo4j-ui/src/views/hippo4j/item/index.vue
diff --git a/hippo4j-server/hippo4j-ui/src/views/hippo4j/log/index.vue b/hippo4j-ui/src/views/hippo4j/log/index.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/views/hippo4j/log/index.vue
rename to hippo4j-ui/src/views/hippo4j/log/index.vue
diff --git a/hippo4j-server/hippo4j-ui/src/views/hippo4j/monitor/components/LineChart.vue b/hippo4j-ui/src/views/hippo4j/monitor/components/LineChart.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/views/hippo4j/monitor/components/LineChart.vue
rename to hippo4j-ui/src/views/hippo4j/monitor/components/LineChart.vue
diff --git a/hippo4j-server/hippo4j-ui/src/views/hippo4j/monitor/components/PieChart.vue b/hippo4j-ui/src/views/hippo4j/monitor/components/PieChart.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/views/hippo4j/monitor/components/PieChart.vue
rename to hippo4j-ui/src/views/hippo4j/monitor/components/PieChart.vue
diff --git a/hippo4j-server/hippo4j-ui/src/views/hippo4j/monitor/components/RaddarChart.vue b/hippo4j-ui/src/views/hippo4j/monitor/components/RaddarChart.vue
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/views/hippo4j/monitor/components/RaddarChart.vue
rename to hippo4j-ui/src/views/hippo4j/monitor/components/RaddarChart.vue
diff --git a/hippo4j-server/hippo4j-ui/src/views/hippo4j/monitor/components/mixins/resize.js b/hippo4j-ui/src/views/hippo4j/monitor/components/mixins/resize.js
similarity index 100%
rename from hippo4j-server/hippo4j-ui/src/views/hippo4j/monitor/components/mixins/resize.js
rename to hippo4j-ui/src/views/hippo4j/monitor/components/mixins/resize.js
diff --git a/hippo4j-server/hippo4j-ui/src/views/hippo4j/monitor/index.vue b/hippo4j-ui/src/views/hippo4j/monitor/index.vue
similarity index 97%
rename from hippo4j-server/hippo4j-ui/src/views/hippo4j/monitor/index.vue
rename to hippo4j-ui/src/views/hippo4j/monitor/index.vue
index 686ff773..58d14f69 100755
--- a/hippo4j-server/hippo4j-ui/src/views/hippo4j/monitor/index.vue
+++ b/hippo4j-ui/src/views/hippo4j/monitor/index.vue
@@ -84,7 +84,7 @@