From 0dacfbfb193d2771624da950e27b5da7ebc62fee Mon Sep 17 00:00:00 2001 From: GCC1566 <156654540@qq.com> Date: Fri, 22 Nov 2024 22:22:02 +0800 Subject: [PATCH 01/34] =?UTF-8?q?=E5=88=B7=E6=96=B0README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- task-component/README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/task-component/README.md b/task-component/README.md index 724b3c5..7f39772 100644 --- a/task-component/README.md +++ b/task-component/README.md @@ -364,19 +364,19 @@ public interface TaskEntityRepository { */ int save(TaskEntity entity); /** - * 删除任务ID + * 删除任务,根据TaskId删除 * @param id id * @return int */ int removeByTaskId(String id); - + /** * 更新任务(除taskId外,所有字段必须更新) * @param entity 实体 * @return int */ int update(TaskEntity entity); - + /** * 查询全部任务 * @return List @@ -423,8 +423,6 @@ public class TaskEntityReponsitoryImpl implements TaskEntityRepository { return taskDataMapper.selectList(new QueryWrapper<>()); } } - - ``` 只需要实现其中指定的几个持久化和查询方法即可替换component中的JSON文件持久化 -- Gitee From 0a5ea44bfae47834f6ad517adcb34102bd10b26b Mon Sep 17 00:00:00 2001 From: GCC1566 <156654540@qq.com> Date: Sat, 23 Nov 2024 22:33:20 +0800 Subject: [PATCH 02/34] =?UTF-8?q?=E6=96=B0=E5=A2=9EKafka=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kafka-component/pom.xml | 22 ++++++ .../kafka/ApplicationConfiguration.java | 9 +++ .../consumer/AbstracTopicConsumer.java | 17 +++++ .../consumer/AbstractTopicObserver.java | 49 ++++++++++++ .../component/consumer/InitConsumer.java | 40 ++++++++++ .../consumer/RegistrationHelper.java | 31 ++++++++ .../component/consumer/TopicConsumer.java | 14 ++++ .../component/consumer/TopicObserver.java | 20 +++++ .../component/product/KafkaCallback.java | 16 ++++ .../kafka/component/product/KafkaProduct.java | 42 ++++++++++ .../product/impl/KafkaProductImpl.java | 38 ++++++++++ .../kafka/configure/KafkaConfigure.java | 76 +++++++++++++++++++ .../main/resources/META-INF/spring.factories | 1 + pom.xml | 1 + 14 files changed, 376 insertions(+) create mode 100644 kafka-component/pom.xml create mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/ApplicationConfiguration.java create mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstracTopicConsumer.java create mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstractTopicObserver.java create mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/InitConsumer.java create mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/RegistrationHelper.java create mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicConsumer.java create mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicObserver.java create mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/component/product/KafkaCallback.java create mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/component/product/KafkaProduct.java create mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/component/product/impl/KafkaProductImpl.java create mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/configure/KafkaConfigure.java create mode 100644 kafka-component/src/main/resources/META-INF/spring.factories diff --git a/kafka-component/pom.xml b/kafka-component/pom.xml new file mode 100644 index 0000000..d247212 --- /dev/null +++ b/kafka-component/pom.xml @@ -0,0 +1,22 @@ + + 4.0.0 + + com.gcc.container + components + 1.0.0 + + com.gcc.container.components + kafka-component + ${component.version} + jar + + + + org.springframework.kafka + spring-kafka + + + + + diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/ApplicationConfiguration.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/ApplicationConfiguration.java new file mode 100644 index 0000000..3f4b1f7 --- /dev/null +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/ApplicationConfiguration.java @@ -0,0 +1,9 @@ +package com.gcc.container.components.kafka; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan(basePackages = "com.gcc.container.components.kafka.*") +public class ApplicationConfiguration { +} diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstracTopicConsumer.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstracTopicConsumer.java new file mode 100644 index 0000000..c3d1b42 --- /dev/null +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstracTopicConsumer.java @@ -0,0 +1,17 @@ +package com.gcc.container.components.kafka.component.consumer; + +/** + * 抽象消费者 + */ +public abstract class AbstracTopicConsumer implements TopicConsumer{ + + private String topic; + + public AbstracTopicConsumer(String topic) { + this.topic = topic; + } + + public String getTopic() { + return topic; + } +} diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstractTopicObserver.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstractTopicObserver.java new file mode 100644 index 0000000..c524a80 --- /dev/null +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstractTopicObserver.java @@ -0,0 +1,49 @@ +package com.gcc.container.components.kafka.component.consumer; + +import cn.hutool.json.JSONUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.kafka.support.Acknowledgment; + +import java.util.ArrayList; +import java.util.List; + +public abstract class AbstractTopicObserver implements TopicObserver, InitializingBean { + private static final Logger log = LoggerFactory.getLogger("TopicObserver"); + private String topic; + private List consumers = new ArrayList<>(); + + public AbstractTopicObserver(String topic) { + this.topic = topic; + } + + @Override + public void addLinstener(TopicConsumer consumer) { + consumers.add(consumer); + } + + @Override + public void noticeConsumer(Object messageObject, Acknowledgment acknowledgment) { + log.info("message :{}", JSONUtil.parseObj(messageObject).toJSONString(0)); + try { + for (TopicConsumer consumer:consumers){ + consumer.onMessage(messageObject); + } + if(null != acknowledgment){ + acknowledgment.acknowledge(); + } + }catch (Exception e){ + log.error("message of {} consume fail",topic); + } + } + + public String getTopic(){ + return this.topic; + } + + @Override + public void afterPropertiesSet() throws Exception { + RegistrationHelper.registerObserver(this); + } +} diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/InitConsumer.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/InitConsumer.java new file mode 100644 index 0000000..1f4bf76 --- /dev/null +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/InitConsumer.java @@ -0,0 +1,40 @@ +package com.gcc.container.components.kafka.component.consumer; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.ApplicationContext; +import org.springframework.context.event.EventListener; +import org.springframework.kafka.config.KafkaListenerEndpointRegistry; +import org.springframework.kafka.listener.MessageListenerContainer; +import org.springframework.stereotype.Component; +import java.util.Map; + +@Slf4j +@Component +public class InitConsumer { + + @Autowired + private ApplicationContext context; + + @Autowired + private KafkaListenerEndpointRegistry registry; + + @EventListener + public void onApplicationEvent(ApplicationReadyEvent event){ + registerAllConsumer(); + for (MessageListenerContainer container : registry.getListenerContainers()) { + container.start(); + } + } + + private void registerAllConsumer(){ + // 获取所有BaseService类型的bean + Map beans = context.getBeansOfType(AbstracTopicConsumer.class); + // 打印每个找到的bean的名字及其toString()输出 + for (Map.Entry entry : beans.entrySet()) { + RegistrationHelper.registerConsumer(entry.getValue()); + } + } + +} diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/RegistrationHelper.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/RegistrationHelper.java new file mode 100644 index 0000000..ead4102 --- /dev/null +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/RegistrationHelper.java @@ -0,0 +1,31 @@ +package com.gcc.container.components.kafka.component.consumer; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * 消费与观察者注册 + * @author GCC + */ +@Slf4j +public class RegistrationHelper { + + private final static ConcurrentMap observerContext = new ConcurrentHashMap<>(); + + + public static void registerObserver(AbstractTopicObserver observer){ + observerContext.put(observer.getTopic(),observer); + } + + public static void registerConsumer(AbstracTopicConsumer consumer){ + if(observerContext.containsKey(consumer.getTopic())){ + observerContext.get(consumer.getTopic()).addLinstener(consumer); + }else { + log.warn(" consumer of topic ‘{}’ register fail,no this observer",consumer.getTopic()); + } + } + + +} diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicConsumer.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicConsumer.java new file mode 100644 index 0000000..49433e8 --- /dev/null +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicConsumer.java @@ -0,0 +1,14 @@ +package com.gcc.container.components.kafka.component.consumer; + +/** + * 具体的消费者 + * @author GCC + */ +interface TopicConsumer { + /** + * 处理消息对象 + * @param messageObj 消息对象 + */ + void onMessage(Object messageObj); + +} diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicObserver.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicObserver.java new file mode 100644 index 0000000..d5578a6 --- /dev/null +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicObserver.java @@ -0,0 +1,20 @@ +package com.gcc.container.components.kafka.component.consumer; + +import org.springframework.kafka.support.Acknowledgment; + +interface TopicObserver { + + /** + * 新增消费者 + * @param consumer 消费者 + */ + void addLinstener(TopicConsumer consumer); + + /** + * 通知消费之 + * @param messageObject 消息 + * @param acknowledgment 事务控制 + */ + void noticeConsumer(Object messageObject, Acknowledgment acknowledgment); + +} diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/product/KafkaCallback.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/product/KafkaCallback.java new file mode 100644 index 0000000..319d31e --- /dev/null +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/product/KafkaCallback.java @@ -0,0 +1,16 @@ +package com.gcc.container.components.kafka.component.product; + +import org.springframework.kafka.support.SendResult; +import org.springframework.util.concurrent.ListenableFutureCallback; + +public interface KafkaCallback extends ListenableFutureCallback> { + @Override + default void onSuccess(SendResult result) { + //回调处理 + } + + @Override + default void onFailure(Throwable ex) { + //错误处理 + } +} diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/product/KafkaProduct.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/product/KafkaProduct.java new file mode 100644 index 0000000..b34c5f4 --- /dev/null +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/product/KafkaProduct.java @@ -0,0 +1,42 @@ +package com.gcc.container.components.kafka.component.product; + +/** + * 生产者工具 + * @author GCC + */ +public interface KafkaProduct { + + /** + * 向Topic发送消息 + * @param topic topic + * @param message 消息信息 + */ + void sendMessage(final String topic, Object message); + + /** + * 向Topic发送消息 + * @param topic topic + * @param key key + * @param message 消息 + */ + void sendMessage(final String topic, String key, Object message); + + /** + * 异步发送消息并回调 + * @param topic topic + * @param message 消息 + * @param callback 回调函数 + */ + void sendAsyncMessage(final String topic, Object message, KafkaCallback callback); + + + /** + *异步发送消息并回调 + * @param topic topic + * @param key key + * @param message 消息 + * @param callback 回调函数 + */ + void sendAsyncMessage(String topic, String key, String message, KafkaCallback callback); + +} diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/product/impl/KafkaProductImpl.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/product/impl/KafkaProductImpl.java new file mode 100644 index 0000000..7d698b2 --- /dev/null +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/product/impl/KafkaProductImpl.java @@ -0,0 +1,38 @@ +package com.gcc.container.components.kafka.component.product.impl; + +import com.gcc.container.components.kafka.component.product.KafkaCallback; +import com.gcc.container.components.kafka.component.product.KafkaProduct; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.support.SendResult; +import org.springframework.stereotype.Component; +import org.springframework.util.concurrent.ListenableFuture; + +@Component +public class KafkaProductImpl implements KafkaProduct { + + @Autowired + private KafkaTemplate kafkaTemplate; + + @Override + public void sendMessage(final String topic, Object message) { + kafkaTemplate.send(topic, message); + } + + @Override + public void sendMessage(final String topic, String key, Object message) { + kafkaTemplate.send(topic, key, message); + } + + @Override + public void sendAsyncMessage(final String topic, Object message, KafkaCallback callback) { + ListenableFuture> future = kafkaTemplate.send(topic, message); + future.addCallback(callback); + } + + @Override + public void sendAsyncMessage(String topic, String key, String message, KafkaCallback callback) { + ListenableFuture> future = kafkaTemplate.send(topic, key, message); + future.addCallback(callback); + } +} \ No newline at end of file diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/configure/KafkaConfigure.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/configure/KafkaConfigure.java new file mode 100644 index 0000000..e17e695 --- /dev/null +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/configure/KafkaConfigure.java @@ -0,0 +1,76 @@ +package com.gcc.container.components.kafka.configure; + +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.annotation.EnableKafka; +import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; +import org.springframework.kafka.config.KafkaListenerEndpointRegistry; +import org.springframework.kafka.core.*; +import java.util.HashMap; +import java.util.Map; + +@Configuration +@EnableKafka +public class KafkaConfigure { + + @Value("${spring.kafka.bootstrap-servers}") + private String bootstrapServers; + + @Value("${spring.kafka.consumer.group-id}") + private String groupId; + + @Value("${spring.kafka.consumer.auto-offset-reset}") + private String autoOffsetReset; + + @Value("${spring.kafka.consumer.enable-auto-commit}") + private boolean enableAutoCommit; + + @Value("${spring.kafka.producer.key-serializer}") + private String keySerializer; + + @Value("${spring.kafka.producer.value-serializer}") + private String valueSerializer; + + @Bean + public ProducerFactory producerFactory() { + Map configProps = new HashMap<>(); + configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); + configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, keySerializer); + configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, valueSerializer); + return new DefaultKafkaProducerFactory<>(configProps); + } + + @Bean + public KafkaTemplate kafkaTemplate() { + return new KafkaTemplate<>(producerFactory()); + } + + @Bean + public ConsumerFactory consumerFactory() { + Map props = new HashMap<>(); + props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); + props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId); + props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, autoOffsetReset); + props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, enableAutoCommit); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + return new DefaultKafkaConsumerFactory<>(props); + } + + @Bean + public KafkaListenerEndpointRegistry kafkaListenerEndpointRegistry() { + return new KafkaListenerEndpointRegistry(); + } + @Bean + public ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory() { + ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>(); + factory.setConsumerFactory(consumerFactory()); + return factory; + } + + +} diff --git a/kafka-component/src/main/resources/META-INF/spring.factories b/kafka-component/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..53cd526 --- /dev/null +++ b/kafka-component/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.gcc.container.components.kafka.ApplicationConfiguration \ No newline at end of file diff --git a/pom.xml b/pom.xml index 5b300ad..334a202 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,7 @@ initdatabse-component es-component task-component + kafka-component -- Gitee From ddb86609c8fbf7d8d41b94c26ac5409ded27424e Mon Sep 17 00:00:00 2001 From: GCC1566 <156654540@qq.com> Date: Sun, 24 Nov 2024 18:30:11 +0800 Subject: [PATCH 03/34] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../consumer/AbstracTopicConsumer.java | 1 + .../consumer/AbstractTopicObserver.java | 11 ++- .../component/consumer/TopicConsumer.java | 4 +- .../component/consumer/TopicObserver.java | 3 +- .../AbstractDataStreamProcessor.java | 29 ++++++ .../datastream/DataStreamProcessor.java | 9 ++ .../datastream/annotation/DataStream.java | 15 +++ .../kafka/configure/DataStreamConfigure.java | 92 +++++++++++++++++++ 8 files changed, 157 insertions(+), 7 deletions(-) create mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/component/datastream/AbstractDataStreamProcessor.java create mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/component/datastream/DataStreamProcessor.java create mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/component/datastream/annotation/DataStream.java create mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/configure/DataStreamConfigure.java diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstracTopicConsumer.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstracTopicConsumer.java index c3d1b42..1d5f2cf 100644 --- a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstracTopicConsumer.java +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstracTopicConsumer.java @@ -14,4 +14,5 @@ public abstract class AbstracTopicConsumer implements TopicConsumer{ public String getTopic() { return topic; } + } diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstractTopicObserver.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstractTopicObserver.java index c524a80..8e6df3a 100644 --- a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstractTopicObserver.java +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstractTopicObserver.java @@ -1,6 +1,7 @@ package com.gcc.container.components.kafka.component.consumer; import cn.hutool.json.JSONUtil; +import org.apache.kafka.clients.consumer.Consumer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; @@ -18,13 +19,17 @@ public abstract class AbstractTopicObserver implements TopicObserver, Initializi this.topic = topic; } + public String getTopic(){ + return this.topic; + } + @Override public void addLinstener(TopicConsumer consumer) { consumers.add(consumer); } @Override - public void noticeConsumer(Object messageObject, Acknowledgment acknowledgment) { + public void noticeConsumer(Consumer messageObject, Acknowledgment acknowledgment) { log.info("message :{}", JSONUtil.parseObj(messageObject).toJSONString(0)); try { for (TopicConsumer consumer:consumers){ @@ -38,10 +43,6 @@ public abstract class AbstractTopicObserver implements TopicObserver, Initializi } } - public String getTopic(){ - return this.topic; - } - @Override public void afterPropertiesSet() throws Exception { RegistrationHelper.registerObserver(this); diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicConsumer.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicConsumer.java index 49433e8..3d36ccc 100644 --- a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicConsumer.java +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicConsumer.java @@ -1,5 +1,7 @@ package com.gcc.container.components.kafka.component.consumer; +import org.apache.kafka.clients.consumer.Consumer; + /** * 具体的消费者 * @author GCC @@ -9,6 +11,6 @@ interface TopicConsumer { * 处理消息对象 * @param messageObj 消息对象 */ - void onMessage(Object messageObj); + void onMessage(Consumer messageObj); } diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicObserver.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicObserver.java index d5578a6..5d0823c 100644 --- a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicObserver.java +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicObserver.java @@ -1,5 +1,6 @@ package com.gcc.container.components.kafka.component.consumer; +import org.apache.kafka.clients.consumer.Consumer; import org.springframework.kafka.support.Acknowledgment; interface TopicObserver { @@ -15,6 +16,6 @@ interface TopicObserver { * @param messageObject 消息 * @param acknowledgment 事务控制 */ - void noticeConsumer(Object messageObject, Acknowledgment acknowledgment); + void noticeConsumer(Consumer messageObject, Acknowledgment acknowledgment); } diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/datastream/AbstractDataStreamProcessor.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/datastream/AbstractDataStreamProcessor.java new file mode 100644 index 0000000..66a0d30 --- /dev/null +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/datastream/AbstractDataStreamProcessor.java @@ -0,0 +1,29 @@ +package com.gcc.container.components.kafka.component.datastream; + + +import java.util.concurrent.atomic.AtomicBoolean; + +public abstract class AbstractDataStreamProcessor implements DataStreamProcessor { + private DataStreamProcessor nextProcessor; + + @Override + public void setNext(DataStreamProcessor nextProcessor) { + this.nextProcessor = nextProcessor; + } + + @Override + public void handle(Object data) { + AtomicBoolean flag = disposeData(data); + if(flag.get() && null != nextProcessor){ + nextProcessor.handle(data); + } + } + + /** + * 处理数据 + * @param data 数据 + * @return AtomicBoolean 如果返回为true,则代表继续向下处理,否则,则终止 + */ + abstract AtomicBoolean disposeData(Object data); + +} diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/datastream/DataStreamProcessor.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/datastream/DataStreamProcessor.java new file mode 100644 index 0000000..22995f6 --- /dev/null +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/datastream/DataStreamProcessor.java @@ -0,0 +1,9 @@ +package com.gcc.container.components.kafka.component.datastream; + +interface DataStreamProcessor { + + void setNext(DataStreamProcessor nextProcessor); + + void handle(Object data); + +} diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/datastream/annotation/DataStream.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/datastream/annotation/DataStream.java new file mode 100644 index 0000000..7d83917 --- /dev/null +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/datastream/annotation/DataStream.java @@ -0,0 +1,15 @@ +package com.gcc.container.components.kafka.component.datastream.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface DataStream { + + String dataStreamName(); + + int order() default 0; +} diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/configure/DataStreamConfigure.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/configure/DataStreamConfigure.java new file mode 100644 index 0000000..f7db332 --- /dev/null +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/configure/DataStreamConfigure.java @@ -0,0 +1,92 @@ +package com.gcc.container.components.kafka.configure; + + +import com.gcc.container.components.kafka.component.datastream.AbstractDataStreamProcessor; +import com.gcc.container.components.kafka.component.datastream.annotation.DataStream; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.util.ReflectionUtils; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +@Configuration +public class DataStreamConfigure { + private final Map> dataStreamChains = new ConcurrentHashMap<>(); + + @Autowired + public void setDataStreamProcessors(Map processors) { + processors.forEach((beanName, processor) -> { + DataStream annotation = processor.getClass().getAnnotation(DataStream.class); + if (annotation != null) { + String dataStreamName = annotation.dataStreamName(); + int order = annotation.order(); + dataStreamChains.computeIfAbsent(dataStreamName, k -> new ArrayList<>()).add(processor); + } + }); + + dataStreamChains.forEach((dataStreamName, processorsList) -> { + Collections.sort(processorsList, (p1, p2) -> { + DataStream a1 = p1.getClass().getAnnotation(DataStream.class); + DataStream a2 = p2.getClass().getAnnotation(DataStream.class); + return Integer.compare(a1.order(), a2.order()); + }); + + // 构建责任链 + AbstractDataStreamProcessor current = null; + for (AbstractDataStreamProcessor processor : processorsList) { + if (current == null) { + current = processor; + } else { + current.setNext(processor); + current = processor; + } + } + }); + } + + @Bean + public BeanPostProcessor beanPostProcessor() { + return new BeanPostProcessor() { + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + if (bean instanceof AbstractDataStreamProcessor) { + Field field = ReflectionUtils.findField(bean.getClass(), "nextProcessor"); + if (field != null) { + ReflectionUtils.makeAccessible(field); + ReflectionUtils.setField(field, bean, getNextHandler((AbstractDataStreamProcessor) bean)); + } + } + return bean; + } + + private AbstractDataStreamProcessor getNextHandler(AbstractDataStreamProcessor processor) { + DataStream annotation = processor.getClass().getAnnotation(DataStream.class); + if (annotation != null) { + String dataStreamName = annotation.dataStreamName(); + List processorsList = dataStreamChains.get(dataStreamName); + if (processorsList != null) { + int currentIndex = processorsList.indexOf(processor); + if (currentIndex < processorsList.size() - 1) { + return processorsList.get(currentIndex + 1); + } + } + } + return null; + } + }; + } + + @Bean + public Map dataStreamProcessorMap() { + return dataStreamChains.entrySet().stream() + .collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().get(0))); + } +} -- Gitee From f5b14b7e21d6b70e74179f78f38653a4cea86f2b Mon Sep 17 00:00:00 2001 From: GCC1566 <156654540@qq.com> Date: Mon, 25 Nov 2024 21:50:00 +0800 Subject: [PATCH 04/34] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=B8=83=E9=9A=86?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kafka-component/pom.xml | 5 + .../kafka/filter/BloomFilterFactory.java | 203 ++++++++++++++++++ .../kafka/filter/StringBloomFilter.java | 78 +++++++ 3 files changed, 286 insertions(+) create mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/filter/BloomFilterFactory.java create mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/filter/StringBloomFilter.java diff --git a/kafka-component/pom.xml b/kafka-component/pom.xml index d247212..79b9e57 100644 --- a/kafka-component/pom.xml +++ b/kafka-component/pom.xml @@ -16,6 +16,11 @@ org.springframework.kafka spring-kafka + + com.google.guava + guava + 33.2.1-jre + diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/BloomFilterFactory.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/BloomFilterFactory.java new file mode 100644 index 0000000..f0bf603 --- /dev/null +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/BloomFilterFactory.java @@ -0,0 +1,203 @@ +package com.gcc.container.components.kafka.filter; + +import com.google.common.base.Charsets; +import com.google.common.hash.BloomFilter; +import com.google.common.hash.Funnel; +import com.google.common.hash.Funnels; +import com.google.common.hash.PrimitiveSink; +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.springframework.stereotype.Component; + +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +@Component +public class BloomFilterFactory { + + private final Map> bloomFilters = new HashMap<>(); + private final ScheduledExecutorService scheduler; + + public BloomFilterFactory() { + this.scheduler = Executors.newScheduledThreadPool(1, new ThreadFactoryBuilder().setNameFormat("bloom-filter-scheduler-%d").build()); + Runtime.getRuntime().addShutdownHook(new Thread(this::shutdown)); + } + + /** + * 创建一个过时即清零的布隆 + * + * @param name 布隆过滤器的唯一名称 + * @param expectedInsertions 预期插入的元素数量 + * @param fpp 可接受的最大误判率 (0 < fpp < 1) + * @param funnel 元素类型的Funnel + * @param expirationTimeSecs 倒计时时间(秒) + * @param 要存储的元素类型 + * @return 创建的布隆过滤器 + */ + public ExpiringBloomFilter createExpiringBloomFilter( + String name, + int expectedInsertions, + double fpp, + Funnel funnel, + long expirationTimeSecs) { + BloomFilter bloomFilter = BloomFilter.create(funnel, expectedInsertions, fpp); + ExpiringBloomFilter expiringBloomFilter = new ExpiringBloomFilter<>(bloomFilter, expirationTimeSecs * 1000L); + + synchronized (bloomFilters) { + bloomFilters.put(name, expiringBloomFilter); + } + + scheduler.schedule(() -> { + synchronized (bloomFilters) { + expiringBloomFilter.expire(); + bloomFilters.remove(name); + } + }, expirationTimeSecs, TimeUnit.SECONDS); + + return expiringBloomFilter; + } + + /** + * 创建一个过时即清零的String布隆 + * + * @param name 布隆过滤器的唯一名称 + * @param expectedInsertions 预期插入的元素数量 + * @param fpp 可接受的最大误判率 (0 < fpp < 1) + * @param expirationTimeSecs 倒计时时间(秒) + * @return 创建的布隆过滤器 + */ + public ExpiringBloomFilter createExpiringStringBloomFilter( + String name, + int expectedInsertions, + double fpp, + long expirationTimeSecs) { + Funnel funnel = new Funnel() { + @Override + public void funnel(String from, PrimitiveSink into) { + into.putString(from, Charsets.US_ASCII); + } + }; + return createExpiringBloomFilter(name, expectedInsertions, fpp, funnel, expirationTimeSecs); + } + + /** + * 创建一个每天在23:59:59自动清零的布隆过滤器。 + * + * @param name 布隆过滤器的唯一名称 + * @param expectedInsertions 预期插入的元素数量 + * @param fpp 可接受的最大误判率 (0 < fpp < 1) + * @param funnel 元素类型的Funnel + * @param 要存储的元素类型 + * @return 创建的布隆过滤器 + */ + public ExpiringBloomFilter createDailyResetBloomFilter( + String name, + int expectedInsertions, + double fpp, + Funnel funnel) { + + BloomFilter bloomFilter = BloomFilter.create(funnel, expectedInsertions, fpp); + ExpiringBloomFilter expiringBloomFilter = new ExpiringBloomFilter<>(bloomFilter); + + synchronized (bloomFilters) { + bloomFilters.put(name, expiringBloomFilter); + } + + long timeToMidnightMillis = calculateTimeToMidnight(); + scheduler.scheduleAtFixedRate(() -> { + synchronized (bloomFilters) { + expiringBloomFilter.expire(); + // 重置布隆过滤器 + bloomFilter = BloomFilter.create(funnel, expectedInsertions, fpp); + expiringBloomFilter.reset(bloomFilter); + } + }, timeToMidnightMillis, TimeUnit.DAYS.toMillis(1), TimeUnit.MILLISECONDS); + + return expiringBloomFilter; + } + + /** + * 创建一个每天在23:59:59自动清零的布隆过滤器。 + * + * @param name 布隆过滤器的唯一名称 + * @param expectedInsertions 预期插入的元素数量 + * @param fpp 可接受的最大误判率 (0 < fpp < 1) + * @return 创建的布隆过滤器 + */ + public ExpiringBloomFilter createDailyResetStringBloomFilter( + String name, + int expectedInsertions, + double fpp) { + + Funnel funnel = Funnels.stringFunnel(StandardCharsets.UTF_8); + return createDailyResetBloomFilter(name, expectedInsertions, fpp, funnel); + } + + + public ExpiringBloomFilter getBloomFilter(String name) { + synchronized (bloomFilters) { + return (ExpiringBloomFilter) bloomFilters.get(name); + } + } + + private long calculateTimeToMidnight() { + LocalDateTime now = LocalDateTime.now(); + LocalDateTime endOfDay = LocalDateTime.of(now.toLocalDate(), LocalTime.of(23, 59, 59)); + Duration duration = Duration.between(now, endOfDay); + return duration.toMillis(); + } + + private void shutdown() { + scheduler.shutdown(); + try { + if (!scheduler.awaitTermination(60, TimeUnit.SECONDS)) { + scheduler.shutdownNow(); + } + } catch (InterruptedException e) { + scheduler.shutdownNow(); + Thread.currentThread().interrupt(); + } + } + + public static class ExpiringBloomFilter { + private volatile BloomFilter bloomFilter; + private final long expirationTimeMillis; + + public ExpiringBloomFilter(BloomFilter bloomFilter, long expirationTimeMillis) { + this.bloomFilter = bloomFilter; + this.expirationTimeMillis = expirationTimeMillis; + } + + public ExpiringBloomFilter(BloomFilter bloomFilter) { + this(bloomFilter, 0); + } + + public void put(T item) { + if (bloomFilter != null) { + bloomFilter.put(item); + } + } + + public boolean mightContain(T item) { + return bloomFilter != null && bloomFilter.mightContain(item); + } + + public void expire() { + bloomFilter = null; // 清理布隆过滤器 + } + + public void reset(BloomFilter newBloomFilter) { + this.bloomFilter = newBloomFilter; + } + + public boolean isExpired() { + return bloomFilter == null; + } + } +} diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/StringBloomFilter.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/StringBloomFilter.java new file mode 100644 index 0000000..7960e7f --- /dev/null +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/StringBloomFilter.java @@ -0,0 +1,78 @@ +package com.gcc.container.components.kafka.filter; + +import com.google.common.base.Charsets; +import com.google.common.hash.Funnel; +import com.google.common.hash.Hashing; +import com.google.common.hash.PrimitiveSink; + +import java.util.BitSet; + +public class StringBloomFilter { + private final BitSet bitSet; + private final Funnel funnel; + private final int numHashFunctions; + private final int bitSetSize; + + public StringBloomFilter(int expectedInsertions, double fpp) { + // 计算布隆过滤器的大小和哈希函数的数量 + this.bitSetSize = optimalNumOfBits(expectedInsertions, fpp); + this.numHashFunctions = optimalNumOfHashFunctions(expectedInsertions, bitSetSize); + + // 初始化BitSet + this.bitSet = new BitSet(bitSetSize); + + // 定义Funnel,用于将字符串转换为字节流 + this.funnel = new Funnel() { + @Override + public void funnel(String from, PrimitiveSink into) { + into.putString(from, Charsets.US_ASCII); + } + }; + } + + // 添加元素到布隆过滤器 + public void put(String element) { + for (int i = 0; i < numHashFunctions; i++) { + int hash = Hashing.murmur3_32(i).hashObject(element, funnel).asInt(); + int index = Math.abs(hash % bitSetSize); + bitSet.set(index); + } + } + + // 检查元素是否可能在布隆过滤器中 + public boolean mightContain(String element) { + for (int i = 0; i < numHashFunctions; i++) { + int hash = Hashing.murmur3_32(i).hashObject(element, funnel).asInt(); + int index = Math.abs(hash % bitSetSize); + if (!bitSet.get(index)) { + return false; + } + } + return true; + } + + // 计算最优的位数组大小 + private static int optimalNumOfBits(long n, double p) { + if (p == 0) { + p = Double.MIN_VALUE; + } + return (int) (-n * Math.log(p) / (Math.log(2) * Math.log(2))); + } + + // 计算最优的哈希函数数量 + private static int optimalNumOfHashFunctions(long n, long m) { + return Math.max(1, (int) Math.round((double) m / n * Math.log(2))); + } + + public static void main(String[] args) { + StringBloomFilter bloomFilter = new StringBloomFilter(1000000, 0.01); + + // 添加一些元素 + bloomFilter.put("hello"); + bloomFilter.put("world"); + + // 检查元素是否存在 + System.out.println(bloomFilter.mightContain("hello")); // 输出: true + System.out.println(bloomFilter.mightContain("test")); // 输出: 可能是false,也可能是true(假阳性) + } +} \ No newline at end of file -- Gitee From 3cdfb5b9919814635da6408dc3ee9ea4f45e1a17 Mon Sep 17 00:00:00 2001 From: GCC1566 <156654540@qq.com> Date: Mon, 25 Nov 2024 22:05:24 +0800 Subject: [PATCH 05/34] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E5=B8=83=E9=9A=86=E8=BF=87=E6=BB=A4=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kafka-component/pom.xml | 6 + .../kafka/filter/BloomFilterFactory.java | 188 ++---------------- .../kafka/filter/DailyResetJob.java | 26 +++ .../kafka/filter/ScheduledTaskConfigure.java | 31 +++ 4 files changed, 75 insertions(+), 176 deletions(-) create mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/filter/DailyResetJob.java create mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/filter/ScheduledTaskConfigure.java diff --git a/kafka-component/pom.xml b/kafka-component/pom.xml index 79b9e57..99854df 100644 --- a/kafka-component/pom.xml +++ b/kafka-component/pom.xml @@ -16,6 +16,12 @@ org.springframework.kafka spring-kafka + + + org.springframework.boot + spring-boot-starter-quartz + + com.google.guava guava diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/BloomFilterFactory.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/BloomFilterFactory.java index f0bf603..0a4a212 100644 --- a/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/BloomFilterFactory.java +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/BloomFilterFactory.java @@ -3,201 +3,37 @@ package com.gcc.container.components.kafka.filter; import com.google.common.base.Charsets; import com.google.common.hash.BloomFilter; import com.google.common.hash.Funnel; -import com.google.common.hash.Funnels; import com.google.common.hash.PrimitiveSink; -import com.google.common.util.concurrent.ThreadFactoryBuilder; import org.springframework.stereotype.Component; +import java.util.concurrent.ConcurrentHashMap; + -import java.nio.charset.StandardCharsets; -import java.time.Duration; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; @Component public class BloomFilterFactory { - private final Map> bloomFilters = new HashMap<>(); - private final ScheduledExecutorService scheduler; + private final ConcurrentHashMap> bloomFilters = new ConcurrentHashMap<>(); - public BloomFilterFactory() { - this.scheduler = Executors.newScheduledThreadPool(1, new ThreadFactoryBuilder().setNameFormat("bloom-filter-scheduler-%d").build()); - Runtime.getRuntime().addShutdownHook(new Thread(this::shutdown)); + public ConcurrentHashMap> getBloomFilters() { + return bloomFilters; } - /** - * 创建一个过时即清零的布隆 - * - * @param name 布隆过滤器的唯一名称 - * @param expectedInsertions 预期插入的元素数量 - * @param fpp 可接受的最大误判率 (0 < fpp < 1) - * @param funnel 元素类型的Funnel - * @param expirationTimeSecs 倒计时时间(秒) - * @param 要存储的元素类型 - * @return 创建的布隆过滤器 - */ - public ExpiringBloomFilter createExpiringBloomFilter( - String name, - int expectedInsertions, - double fpp, - Funnel funnel, - long expirationTimeSecs) { - BloomFilter bloomFilter = BloomFilter.create(funnel, expectedInsertions, fpp); - ExpiringBloomFilter expiringBloomFilter = new ExpiringBloomFilter<>(bloomFilter, expirationTimeSecs * 1000L); - - synchronized (bloomFilters) { - bloomFilters.put(name, expiringBloomFilter); - } - - scheduler.schedule(() -> { - synchronized (bloomFilters) { - expiringBloomFilter.expire(); - bloomFilters.remove(name); - } - }, expirationTimeSecs, TimeUnit.SECONDS); - - return expiringBloomFilter; + public BloomFilter getBloomFilter(String name, int expectedInsertions, double fpp) { + return bloomFilters.computeIfAbsent(name, key -> createBloomFilter(expectedInsertions, fpp)); } - /** - * 创建一个过时即清零的String布隆 - * - * @param name 布隆过滤器的唯一名称 - * @param expectedInsertions 预期插入的元素数量 - * @param fpp 可接受的最大误判率 (0 < fpp < 1) - * @param expirationTimeSecs 倒计时时间(秒) - * @return 创建的布隆过滤器 - */ - public ExpiringBloomFilter createExpiringStringBloomFilter( - String name, - int expectedInsertions, - double fpp, - long expirationTimeSecs) { + private BloomFilter createBloomFilter(int expectedInsertions, double fpp) { Funnel funnel = new Funnel() { @Override public void funnel(String from, PrimitiveSink into) { into.putString(from, Charsets.US_ASCII); } }; - return createExpiringBloomFilter(name, expectedInsertions, fpp, funnel, expirationTimeSecs); - } - - /** - * 创建一个每天在23:59:59自动清零的布隆过滤器。 - * - * @param name 布隆过滤器的唯一名称 - * @param expectedInsertions 预期插入的元素数量 - * @param fpp 可接受的最大误判率 (0 < fpp < 1) - * @param funnel 元素类型的Funnel - * @param 要存储的元素类型 - * @return 创建的布隆过滤器 - */ - public ExpiringBloomFilter createDailyResetBloomFilter( - String name, - int expectedInsertions, - double fpp, - Funnel funnel) { - - BloomFilter bloomFilter = BloomFilter.create(funnel, expectedInsertions, fpp); - ExpiringBloomFilter expiringBloomFilter = new ExpiringBloomFilter<>(bloomFilter); - - synchronized (bloomFilters) { - bloomFilters.put(name, expiringBloomFilter); - } - - long timeToMidnightMillis = calculateTimeToMidnight(); - scheduler.scheduleAtFixedRate(() -> { - synchronized (bloomFilters) { - expiringBloomFilter.expire(); - // 重置布隆过滤器 - bloomFilter = BloomFilter.create(funnel, expectedInsertions, fpp); - expiringBloomFilter.reset(bloomFilter); - } - }, timeToMidnightMillis, TimeUnit.DAYS.toMillis(1), TimeUnit.MILLISECONDS); - - return expiringBloomFilter; - } - - /** - * 创建一个每天在23:59:59自动清零的布隆过滤器。 - * - * @param name 布隆过滤器的唯一名称 - * @param expectedInsertions 预期插入的元素数量 - * @param fpp 可接受的最大误判率 (0 < fpp < 1) - * @return 创建的布隆过滤器 - */ - public ExpiringBloomFilter createDailyResetStringBloomFilter( - String name, - int expectedInsertions, - double fpp) { - - Funnel funnel = Funnels.stringFunnel(StandardCharsets.UTF_8); - return createDailyResetBloomFilter(name, expectedInsertions, fpp, funnel); - } - - - public ExpiringBloomFilter getBloomFilter(String name) { - synchronized (bloomFilters) { - return (ExpiringBloomFilter) bloomFilters.get(name); - } - } - private long calculateTimeToMidnight() { - LocalDateTime now = LocalDateTime.now(); - LocalDateTime endOfDay = LocalDateTime.of(now.toLocalDate(), LocalTime.of(23, 59, 59)); - Duration duration = Duration.between(now, endOfDay); - return duration.toMillis(); + return BloomFilter.create(funnel, expectedInsertions, fpp); } - private void shutdown() { - scheduler.shutdown(); - try { - if (!scheduler.awaitTermination(60, TimeUnit.SECONDS)) { - scheduler.shutdownNow(); - } - } catch (InterruptedException e) { - scheduler.shutdownNow(); - Thread.currentThread().interrupt(); - } - } - - public static class ExpiringBloomFilter { - private volatile BloomFilter bloomFilter; - private final long expirationTimeMillis; - - public ExpiringBloomFilter(BloomFilter bloomFilter, long expirationTimeMillis) { - this.bloomFilter = bloomFilter; - this.expirationTimeMillis = expirationTimeMillis; - } - - public ExpiringBloomFilter(BloomFilter bloomFilter) { - this(bloomFilter, 0); - } - - public void put(T item) { - if (bloomFilter != null) { - bloomFilter.put(item); - } - } - - public boolean mightContain(T item) { - return bloomFilter != null && bloomFilter.mightContain(item); - } - - public void expire() { - bloomFilter = null; // 清理布隆过滤器 - } - - public void reset(BloomFilter newBloomFilter) { - this.bloomFilter = newBloomFilter; - } - - public boolean isExpired() { - return bloomFilter == null; - } + public void resetBloomFilter(String name) { + bloomFilters.remove(name); } -} +} \ No newline at end of file diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/DailyResetJob.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/DailyResetJob.java new file mode 100644 index 0000000..f12694a --- /dev/null +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/DailyResetJob.java @@ -0,0 +1,26 @@ +package com.gcc.container.components.kafka.filter; + +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.annotation.PostConstruct; + +public class DailyResetJob implements Job { + + @Autowired + private BloomFilterFactory bloomFilterFactory; + + @PostConstruct + public void init() { + // Initialize the job with the required dependencies + } + + @Override + public void execute(JobExecutionContext context) throws JobExecutionException { + // Reset all bloom filters + bloomFilterFactory.getBloomFilters().keySet().forEach(bloomFilterFactory::resetBloomFilter); + } + +} diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/ScheduledTaskConfigure.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/ScheduledTaskConfigure.java new file mode 100644 index 0000000..11345d0 --- /dev/null +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/ScheduledTaskConfigure.java @@ -0,0 +1,31 @@ +package com.gcc.container.components.kafka.filter; + +import org.quartz.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ScheduledTaskConfigure { + @Bean + public JobDetail dailyResetJobDetail() { + return JobBuilder.newJob(DailyResetJob.class) + .withIdentity("dailyResetJob") + .storeDurably() + .build(); + } + + @Bean + public SimpleTrigger dailyResetTrigger() { + SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule() + .withIntervalInHours(24) + .repeatForever(); + + return TriggerBuilder.newTrigger() + .forJob(dailyResetJobDetail()) + .withIdentity("dailyResetTrigger") + .withSchedule(scheduleBuilder) + .startNow() + .build(); + } + +} -- Gitee From 6f0b0c77cc80f43f7a2a56968a91afbe25019a74 Mon Sep 17 00:00:00 2001 From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> Date: Fri, 29 Nov 2024 00:06:20 +0000 Subject: [PATCH 06/34] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=97=A5=E6=B8=85?= =?UTF-8?q?=E5=B8=83=E9=9A=86=20=E6=89=A9=E5=B1=95=E4=B8=BA=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E6=B8=85=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> --- .../components/kafka/filter/BloomFilterFactory.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/BloomFilterFactory.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/BloomFilterFactory.java index 0a4a212..ffe7d59 100644 --- a/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/BloomFilterFactory.java +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/BloomFilterFactory.java @@ -32,8 +32,15 @@ public class BloomFilterFactory { return BloomFilter.create(funnel, expectedInsertions, fpp); } - - public void resetBloomFilter(String name) { - bloomFilters.remove(name); + @Scheduled(cron = "59 59 23 * * ?" ) + public void resetBloomFilter() { + if(!bloomFilters.isEmpty()) { + for (String name : bloomFilters.keySet()) { + bloomFilters.remove(name); + } + if (bloomFilters.size() == 0) { + log.info("所有Bloom已经结算"); + } + } } } \ No newline at end of file -- Gitee From 192bf5f509ca818598cb3331913f3a380bc87c92 Mon Sep 17 00:00:00 2001 From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> Date: Fri, 29 Nov 2024 00:06:35 +0000 Subject: [PATCH 07/34] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20ka?= =?UTF-8?q?fka-component/src/main/java/com/gcc/container/components/kafka/?= =?UTF-8?q?filter/DailyResetJob.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kafka/filter/DailyResetJob.java | 26 ------------------- 1 file changed, 26 deletions(-) delete mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/filter/DailyResetJob.java diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/DailyResetJob.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/DailyResetJob.java deleted file mode 100644 index f12694a..0000000 --- a/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/DailyResetJob.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.gcc.container.components.kafka.filter; - -import org.quartz.Job; -import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; -import org.springframework.beans.factory.annotation.Autowired; - -import javax.annotation.PostConstruct; - -public class DailyResetJob implements Job { - - @Autowired - private BloomFilterFactory bloomFilterFactory; - - @PostConstruct - public void init() { - // Initialize the job with the required dependencies - } - - @Override - public void execute(JobExecutionContext context) throws JobExecutionException { - // Reset all bloom filters - bloomFilterFactory.getBloomFilters().keySet().forEach(bloomFilterFactory::resetBloomFilter); - } - -} -- Gitee From 7a7fb0e37f8fc753b070442c2dcf951f7d0f8c63 Mon Sep 17 00:00:00 2001 From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> Date: Fri, 29 Nov 2024 00:07:45 +0000 Subject: [PATCH 08/34] =?UTF-8?q?=E5=BC=80=E5=90=AF=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=20=E5=BC=80=E5=90=AF=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> --- .../container/components/kafka/ApplicationConfiguration.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/ApplicationConfiguration.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/ApplicationConfiguration.java index 3f4b1f7..a8bc650 100644 --- a/kafka-component/src/main/java/com/gcc/container/components/kafka/ApplicationConfiguration.java +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/ApplicationConfiguration.java @@ -2,8 +2,9 @@ package com.gcc.container.components.kafka; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; - +import org.springframework.scheduling.annotation.EnableScheduling; @Configuration +@EnableScheduling @ComponentScan(basePackages = "com.gcc.container.components.kafka.*") public class ApplicationConfiguration { } -- Gitee From c588264f367be3becce0a4120fcb41d0039aa749 Mon Sep 17 00:00:00 2001 From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> Date: Fri, 29 Nov 2024 00:07:54 +0000 Subject: [PATCH 09/34] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20ka?= =?UTF-8?q?fka-component/src/main/java/com/gcc/container/components/kafka/?= =?UTF-8?q?filter/StringBloomFilter.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kafka/filter/StringBloomFilter.java | 78 ------------------- 1 file changed, 78 deletions(-) delete mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/filter/StringBloomFilter.java diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/StringBloomFilter.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/StringBloomFilter.java deleted file mode 100644 index 7960e7f..0000000 --- a/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/StringBloomFilter.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.gcc.container.components.kafka.filter; - -import com.google.common.base.Charsets; -import com.google.common.hash.Funnel; -import com.google.common.hash.Hashing; -import com.google.common.hash.PrimitiveSink; - -import java.util.BitSet; - -public class StringBloomFilter { - private final BitSet bitSet; - private final Funnel funnel; - private final int numHashFunctions; - private final int bitSetSize; - - public StringBloomFilter(int expectedInsertions, double fpp) { - // 计算布隆过滤器的大小和哈希函数的数量 - this.bitSetSize = optimalNumOfBits(expectedInsertions, fpp); - this.numHashFunctions = optimalNumOfHashFunctions(expectedInsertions, bitSetSize); - - // 初始化BitSet - this.bitSet = new BitSet(bitSetSize); - - // 定义Funnel,用于将字符串转换为字节流 - this.funnel = new Funnel() { - @Override - public void funnel(String from, PrimitiveSink into) { - into.putString(from, Charsets.US_ASCII); - } - }; - } - - // 添加元素到布隆过滤器 - public void put(String element) { - for (int i = 0; i < numHashFunctions; i++) { - int hash = Hashing.murmur3_32(i).hashObject(element, funnel).asInt(); - int index = Math.abs(hash % bitSetSize); - bitSet.set(index); - } - } - - // 检查元素是否可能在布隆过滤器中 - public boolean mightContain(String element) { - for (int i = 0; i < numHashFunctions; i++) { - int hash = Hashing.murmur3_32(i).hashObject(element, funnel).asInt(); - int index = Math.abs(hash % bitSetSize); - if (!bitSet.get(index)) { - return false; - } - } - return true; - } - - // 计算最优的位数组大小 - private static int optimalNumOfBits(long n, double p) { - if (p == 0) { - p = Double.MIN_VALUE; - } - return (int) (-n * Math.log(p) / (Math.log(2) * Math.log(2))); - } - - // 计算最优的哈希函数数量 - private static int optimalNumOfHashFunctions(long n, long m) { - return Math.max(1, (int) Math.round((double) m / n * Math.log(2))); - } - - public static void main(String[] args) { - StringBloomFilter bloomFilter = new StringBloomFilter(1000000, 0.01); - - // 添加一些元素 - bloomFilter.put("hello"); - bloomFilter.put("world"); - - // 检查元素是否存在 - System.out.println(bloomFilter.mightContain("hello")); // 输出: true - System.out.println(bloomFilter.mightContain("test")); // 输出: 可能是false,也可能是true(假阳性) - } -} \ No newline at end of file -- Gitee From fb9863815c65ebd202b6e806213074f9a81893cc Mon Sep 17 00:00:00 2001 From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> Date: Fri, 29 Nov 2024 00:08:18 +0000 Subject: [PATCH 10/34] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20ka?= =?UTF-8?q?fka-component/src/main/java/com/gcc/container/components/kafka/?= =?UTF-8?q?filter/ScheduledTaskConfigure.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kafka/filter/ScheduledTaskConfigure.java | 31 ------------------- 1 file changed, 31 deletions(-) delete mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/filter/ScheduledTaskConfigure.java diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/ScheduledTaskConfigure.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/ScheduledTaskConfigure.java deleted file mode 100644 index 11345d0..0000000 --- a/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/ScheduledTaskConfigure.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.gcc.container.components.kafka.filter; - -import org.quartz.*; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class ScheduledTaskConfigure { - @Bean - public JobDetail dailyResetJobDetail() { - return JobBuilder.newJob(DailyResetJob.class) - .withIdentity("dailyResetJob") - .storeDurably() - .build(); - } - - @Bean - public SimpleTrigger dailyResetTrigger() { - SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule() - .withIntervalInHours(24) - .repeatForever(); - - return TriggerBuilder.newTrigger() - .forJob(dailyResetJobDetail()) - .withIdentity("dailyResetTrigger") - .withSchedule(scheduleBuilder) - .startNow() - .build(); - } - -} -- Gitee From a857e71a69b3d290431fe851c4222bacaa352358 Mon Sep 17 00:00:00 2001 From: GCC1566 <156654540@qq.com> Date: Sat, 30 Nov 2024 21:26:41 +0800 Subject: [PATCH 11/34] =?UTF-8?q?1=E3=80=81=E7=A7=BB=E9=99=A4kafka?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E5=BF=AB=E9=80=9F=E8=BF=87=E6=BB=A4=E5=99=A8?= =?UTF-8?q?=202=E3=80=81=E6=96=B0=E5=BB=BA=E5=BF=AB=E9=80=9F=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E5=99=A8=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kafka-component/pom.xml | 6 +-- .../kafka/filter/BloomFilterFactory.java | 46 ------------------ pom.xml | 1 + quickfilter-component/pom.xml | 24 ++++++++++ .../quickfilter/ApplicationConfiguration.java | 11 +++++ .../factory/QuickFilterFactory.java | 12 +++++ .../impl/AbstractQuickFilterFactory.java | 31 ++++++++++++ .../factory/impl/BloomFilterFactory.java | 27 +++++++++++ .../factory/impl/DailyBloomFilterFactory.java | 21 ++++++++ .../quickfilter/filter/QuickFilter.java | 40 ++++++++++++++++ .../filter/impl/BloomFilterPlus.java | 48 +++++++++++++++++++ .../main/resources/META-INF/spring.factories | 1 + 12 files changed, 217 insertions(+), 51 deletions(-) delete mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/filter/BloomFilterFactory.java create mode 100644 quickfilter-component/pom.xml create mode 100644 quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/ApplicationConfiguration.java create mode 100644 quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/factory/QuickFilterFactory.java create mode 100644 quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/factory/impl/AbstractQuickFilterFactory.java create mode 100644 quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/factory/impl/BloomFilterFactory.java create mode 100644 quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/factory/impl/DailyBloomFilterFactory.java create mode 100644 quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/filter/QuickFilter.java create mode 100644 quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/filter/impl/BloomFilterPlus.java create mode 100644 quickfilter-component/src/main/resources/META-INF/spring.factories diff --git a/kafka-component/pom.xml b/kafka-component/pom.xml index 99854df..bc6abae 100644 --- a/kafka-component/pom.xml +++ b/kafka-component/pom.xml @@ -22,11 +22,7 @@ spring-boot-starter-quartz - - com.google.guava - guava - 33.2.1-jre - + diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/BloomFilterFactory.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/BloomFilterFactory.java deleted file mode 100644 index ffe7d59..0000000 --- a/kafka-component/src/main/java/com/gcc/container/components/kafka/filter/BloomFilterFactory.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.gcc.container.components.kafka.filter; - -import com.google.common.base.Charsets; -import com.google.common.hash.BloomFilter; -import com.google.common.hash.Funnel; -import com.google.common.hash.PrimitiveSink; -import org.springframework.stereotype.Component; -import java.util.concurrent.ConcurrentHashMap; - - - -@Component -public class BloomFilterFactory { - - private final ConcurrentHashMap> bloomFilters = new ConcurrentHashMap<>(); - - public ConcurrentHashMap> getBloomFilters() { - return bloomFilters; - } - - public BloomFilter getBloomFilter(String name, int expectedInsertions, double fpp) { - return bloomFilters.computeIfAbsent(name, key -> createBloomFilter(expectedInsertions, fpp)); - } - - private BloomFilter createBloomFilter(int expectedInsertions, double fpp) { - Funnel funnel = new Funnel() { - @Override - public void funnel(String from, PrimitiveSink into) { - into.putString(from, Charsets.US_ASCII); - } - }; - - return BloomFilter.create(funnel, expectedInsertions, fpp); - } - @Scheduled(cron = "59 59 23 * * ?" ) - public void resetBloomFilter() { - if(!bloomFilters.isEmpty()) { - for (String name : bloomFilters.keySet()) { - bloomFilters.remove(name); - } - if (bloomFilters.size() == 0) { - log.info("所有Bloom已经结算"); - } - } - } -} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 334a202..65ce0e6 100644 --- a/pom.xml +++ b/pom.xml @@ -23,6 +23,7 @@ es-component task-component kafka-component + quickfilter-component diff --git a/quickfilter-component/pom.xml b/quickfilter-component/pom.xml new file mode 100644 index 0000000..f033f94 --- /dev/null +++ b/quickfilter-component/pom.xml @@ -0,0 +1,24 @@ + + 4.0.0 + + com.gcc.container + components + 1.0.0 + + com.gcc.container.components + quickfilter-component + ${component.version} + jar + + + + + com.google.guava + guava + 33.2.1-jre + + + + + diff --git a/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/ApplicationConfiguration.java b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/ApplicationConfiguration.java new file mode 100644 index 0000000..f77f529 --- /dev/null +++ b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/ApplicationConfiguration.java @@ -0,0 +1,11 @@ +package com.gcc.container.components.quickfilter; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; + +@Configuration +@EnableScheduling +@ComponentScan(basePackages = "com.gcc.container.components.quickfilter.*") +public class ApplicationConfiguration { +} diff --git a/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/factory/QuickFilterFactory.java b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/factory/QuickFilterFactory.java new file mode 100644 index 0000000..4759318 --- /dev/null +++ b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/factory/QuickFilterFactory.java @@ -0,0 +1,12 @@ +package com.gcc.container.components.quickfilter.factory; + +import com.gcc.container.components.quickfilter.filter.QuickFilter; + +/** + * 快速过滤器工厂 + */ +public interface QuickFilterFactory { + QuickFilter getQuickFilter(String filterName, Integer capacity, Double missProbability); + + void destoryQuickFilter(String filterName); +} diff --git a/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/factory/impl/AbstractQuickFilterFactory.java b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/factory/impl/AbstractQuickFilterFactory.java new file mode 100644 index 0000000..ae89385 --- /dev/null +++ b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/factory/impl/AbstractQuickFilterFactory.java @@ -0,0 +1,31 @@ +package com.gcc.container.components.quickfilter.factory.impl; + + +import com.gcc.container.components.quickfilter.factory.QuickFilterFactory; +import com.gcc.container.components.quickfilter.filter.QuickFilter; + +import java.util.concurrent.ConcurrentHashMap; + +public abstract class AbstractQuickFilterFactory implements QuickFilterFactory { + + protected final ConcurrentHashMap bloomFilters = new ConcurrentHashMap<>(); + + abstract QuickFilter createBloomFilter(Integer expectedInsertions, Double fpp); + + @Override + public QuickFilter getQuickFilter(String filterName, Integer capacity, Double missProbability) { + if(!bloomFilters.containsKey(filterName)){ + QuickFilter obj = createBloomFilter(capacity,missProbability); + bloomFilters.put(filterName,obj); + } + return bloomFilters.get(filterName); + } + + @Override + public void destoryQuickFilter(String filterName) { + if(bloomFilters.containsKey(filterName)){ + bloomFilters.get(filterName).clear(); + bloomFilters.remove(filterName); + } + } +} diff --git a/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/factory/impl/BloomFilterFactory.java b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/factory/impl/BloomFilterFactory.java new file mode 100644 index 0000000..0bb4d16 --- /dev/null +++ b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/factory/impl/BloomFilterFactory.java @@ -0,0 +1,27 @@ +package com.gcc.container.components.quickfilter.factory.impl; + + +import com.gcc.container.components.quickfilter.filter.QuickFilter; +import com.gcc.container.components.quickfilter.filter.impl.BloomFilterPlus; +import com.google.common.base.Charsets; +import com.google.common.hash.BloomFilter; +import com.google.common.hash.Funnel; +import com.google.common.hash.PrimitiveSink; +import org.springframework.stereotype.Component; + + +@Component("BloomFilter") +public class BloomFilterFactory extends AbstractQuickFilterFactory { + + @Override + public QuickFilter createBloomFilter(Integer expectedInsertions, Double fpp) { + Funnel funnel = new Funnel() { + @Override + public void funnel(String from, PrimitiveSink into) { + into.putString(from, Charsets.UTF_8); + } + }; + return new BloomFilterPlus(BloomFilter.create(funnel, expectedInsertions, fpp)); + } + +} diff --git a/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/factory/impl/DailyBloomFilterFactory.java b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/factory/impl/DailyBloomFilterFactory.java new file mode 100644 index 0000000..e28bd9a --- /dev/null +++ b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/factory/impl/DailyBloomFilterFactory.java @@ -0,0 +1,21 @@ +package com.gcc.container.components.quickfilter.factory.impl; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component("DailyBloomFilter") +@Slf4j +public class DailyBloomFilterFactory extends BloomFilterFactory{ + @Scheduled(cron = "59 59 23 * * ?" ) + public void resetBloomFilter() { + if(!bloomFilters.isEmpty()) { + for (String name : bloomFilters.keySet()) { + bloomFilters.remove(name); + } + if (bloomFilters.size() == 0) { + log.info("所有Bloom已经结算"); + } + } + } +} diff --git a/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/filter/QuickFilter.java b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/filter/QuickFilter.java new file mode 100644 index 0000000..1196961 --- /dev/null +++ b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/filter/QuickFilter.java @@ -0,0 +1,40 @@ +package com.gcc.container.components.quickfilter.filter; + +/** + * 快速过滤器 + */ +public interface QuickFilter { + + /** + * 是否在其中 + * @param keyword 关键字 + * @return Boolean + */ + Boolean containsKeyword(String keyword); + + /** + * 追加关键字 + * @param keyword 关键字 + */ + void append(String keyword); + + /** + * 追加内容 + * @param keyword 关键字 + * @param content 内容 + */ + void append(String keyword,String content); + + /** + * 获取内容 + * @param keyword 关键字 + * @return String + */ + String getContent(String keyword); + + /** + * 清空释放 + */ + void clear(); + +} diff --git a/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/filter/impl/BloomFilterPlus.java b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/filter/impl/BloomFilterPlus.java new file mode 100644 index 0000000..8ce80d1 --- /dev/null +++ b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/filter/impl/BloomFilterPlus.java @@ -0,0 +1,48 @@ +package com.gcc.container.components.quickfilter.filter.impl; + +import com.google.common.hash.BloomFilter; +import com.gcc.container.components.quickfilter.filter.QuickFilter; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 布隆快速过滤器 + */ +public class BloomFilterPlus implements QuickFilter { + + private final ConcurrentHashMap innerCache = new ConcurrentHashMap<>(); + + private BloomFilter bloomFilter; + + public BloomFilterPlus(BloomFilter bloomFilter) { + this.bloomFilter = bloomFilter; + } + + @Override + public Boolean containsKeyword(String keyword) { + return bloomFilter.mightContain(keyword); + } + + @Override + public void append(String keyword) { + bloomFilter.put(keyword); + innerCache.put(keyword,""); + } + + @Override + public void append(String keyword, String content) { + bloomFilter.put(keyword); + innerCache.put(keyword,content); + } + + + @Override + public String getContent(String keyword) { + return innerCache.get(keyword); + } + + @Override + public void clear() { + innerCache.clear(); + this.bloomFilter = null; + } +} diff --git a/quickfilter-component/src/main/resources/META-INF/spring.factories b/quickfilter-component/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..4304a0e --- /dev/null +++ b/quickfilter-component/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.gcc.container.components.quickfilter.ApplicationConfiguration \ No newline at end of file -- Gitee From 68a740a27e0592c28d6bd197d25afe0d12939801 Mon Sep 17 00:00:00 2001 From: GCC1566 <156654540@qq.com> Date: Sat, 30 Nov 2024 21:50:07 +0800 Subject: [PATCH 12/34] =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E5=8E=8B=E7=BC=A9?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../quickfilter/filter/QuickFilter.java | 2 +- .../filter/impl/BloomFilterPlus.java | 25 +++++-- .../quickfilter/util/StringZipUtil.java | 69 +++++++++++++++++++ 3 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/util/StringZipUtil.java diff --git a/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/filter/QuickFilter.java b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/filter/QuickFilter.java index 1196961..b755fcd 100644 --- a/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/filter/QuickFilter.java +++ b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/filter/QuickFilter.java @@ -23,7 +23,7 @@ public interface QuickFilter { * @param keyword 关键字 * @param content 内容 */ - void append(String keyword,String content); + void append(String keyword,Object content); /** * 获取内容 diff --git a/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/filter/impl/BloomFilterPlus.java b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/filter/impl/BloomFilterPlus.java index 8ce80d1..cf1b57b 100644 --- a/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/filter/impl/BloomFilterPlus.java +++ b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/filter/impl/BloomFilterPlus.java @@ -1,7 +1,12 @@ package com.gcc.container.components.quickfilter.filter.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.json.JSONUtil; +import com.gcc.container.components.quickfilter.util.StringZipUtil; import com.google.common.hash.BloomFilter; import com.gcc.container.components.quickfilter.filter.QuickFilter; + +import java.io.IOException; import java.util.concurrent.ConcurrentHashMap; /** @@ -25,19 +30,31 @@ public class BloomFilterPlus implements QuickFilter { @Override public void append(String keyword) { bloomFilter.put(keyword); - innerCache.put(keyword,""); } @Override - public void append(String keyword, String content) { + public void append(String keyword, Object content) { bloomFilter.put(keyword); - innerCache.put(keyword,content); + try { + String context = content.toString(); + innerCache.put(keyword, StringZipUtil.compressString(context)); + }catch (IOException e){ + e.printStackTrace(); + } } @Override public String getContent(String keyword) { - return innerCache.get(keyword); + String value = innerCache.get(keyword); + if(null != value) { + try { + return StringZipUtil.decompressString(value); + } catch (Exception e) { + e.printStackTrace(); + } + } + return null; } @Override diff --git a/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/util/StringZipUtil.java b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/util/StringZipUtil.java new file mode 100644 index 0000000..55967b0 --- /dev/null +++ b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/util/StringZipUtil.java @@ -0,0 +1,69 @@ +package com.gcc.container.components.quickfilter.util; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Base64; +import java.util.zip.DataFormatException; +import java.util.zip.Deflater; +import java.util.zip.Inflater; + +public class StringZipUtil { + + public static String compressString(String input) throws IOException { + // 将输入字符串转化为字节数组 + byte[] inputBytes = input.getBytes("UTF-8"); + + // 创建Deflater对象并设置压缩级别 + Deflater deflater = new Deflater(); + deflater.setInput(inputBytes); + deflater.finish(); + + // 使用ByteArrayOutputStream捕获输出 + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(inputBytes.length); + byte[] buffer = new byte[1024]; + while (!deflater.finished()) { + int count = deflater.deflate(buffer); // 压缩 + outputStream.write(buffer, 0, count); + } + outputStream.close(); + byte[] output = outputStream.toByteArray(); + deflater.end(); + return bytesToHex(output); + } + + + // 解压缩方法 + public static String decompressString(String compressedData) throws IOException, DataFormatException { + // 将Base64编码的字符串转换回字节数组 + byte[] compressedBytes = Base64.getDecoder().decode(compressedData); + + Inflater inflater = new Inflater(); + inflater.setInput(compressedBytes); + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(compressedBytes.length); + byte[] buffer = new byte[1024]; + while (!inflater.finished()) { + int count = inflater.inflate(buffer); + outputStream.write(buffer, 0, count); + } + outputStream.close(); + byte[] result = outputStream.toByteArray(); + inflater.end(); + + return new String(result, "UTF-8"); + } + + // 辅助函数:将字节数组转换为十六进制字符串表示 + public static String bytesToHex(byte[] bytes) { + StringBuilder hexString = new StringBuilder(2 * bytes.length); + for (byte b : bytes) { + String hex = Integer.toHexString(0xff & b); + if (hex.length() == 1) { + hexString.append('0'); + } + hexString.append(hex); + } + return hexString.toString(); + } + +} -- Gitee From c40e4595c26eb3446e5d3614787792d5c80dc8ca Mon Sep 17 00:00:00 2001 From: GCC1566 <156654540@qq.com> Date: Sat, 30 Nov 2024 22:32:54 +0800 Subject: [PATCH 13/34] =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E5=8E=8B=E7=BC=A9?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filter/impl/BloomFilterPlus.java | 8 ++- .../quickfilter/util/StringZipUtil.java | 51 +++++++++++++++++-- 2 files changed, 51 insertions(+), 8 deletions(-) diff --git a/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/filter/impl/BloomFilterPlus.java b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/filter/impl/BloomFilterPlus.java index cf1b57b..dc0f546 100644 --- a/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/filter/impl/BloomFilterPlus.java +++ b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/filter/impl/BloomFilterPlus.java @@ -1,7 +1,5 @@ package com.gcc.container.components.quickfilter.filter.impl; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.json.JSONUtil; import com.gcc.container.components.quickfilter.util.StringZipUtil; import com.google.common.hash.BloomFilter; import com.gcc.container.components.quickfilter.filter.QuickFilter; @@ -14,7 +12,7 @@ import java.util.concurrent.ConcurrentHashMap; */ public class BloomFilterPlus implements QuickFilter { - private final ConcurrentHashMap innerCache = new ConcurrentHashMap<>(); + private final ConcurrentHashMap innerCache = new ConcurrentHashMap<>(); private BloomFilter bloomFilter; @@ -37,7 +35,7 @@ public class BloomFilterPlus implements QuickFilter { bloomFilter.put(keyword); try { String context = content.toString(); - innerCache.put(keyword, StringZipUtil.compressString(context)); + innerCache.put(keyword,StringZipUtil.compressString(context)); }catch (IOException e){ e.printStackTrace(); } @@ -46,7 +44,7 @@ public class BloomFilterPlus implements QuickFilter { @Override public String getContent(String keyword) { - String value = innerCache.get(keyword); + byte[] value = innerCache.get(keyword); if(null != value) { try { return StringZipUtil.decompressString(value); diff --git a/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/util/StringZipUtil.java b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/util/StringZipUtil.java index 55967b0..d48590e 100644 --- a/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/util/StringZipUtil.java +++ b/quickfilter-component/src/main/java/com/gcc/container/components/quickfilter/util/StringZipUtil.java @@ -1,15 +1,18 @@ package com.gcc.container.components.quickfilter.util; +import cn.hutool.json.JSONObject; +import lombok.extern.slf4j.Slf4j; + import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Base64; import java.util.zip.DataFormatException; import java.util.zip.Deflater; import java.util.zip.Inflater; - +@Slf4j public class StringZipUtil { - public static String compressString(String input) throws IOException { + public static byte[] compressString(String input) throws IOException { // 将输入字符串转化为字节数组 byte[] inputBytes = input.getBytes("UTF-8"); @@ -28,9 +31,24 @@ public class StringZipUtil { outputStream.close(); byte[] output = outputStream.toByteArray(); deflater.end(); - return bytesToHex(output); + return output; } + public static String decompressString(byte[] compressedData) throws IOException, DataFormatException { + Inflater inflater = new Inflater(); + inflater.setInput(compressedData); + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(compressedData.length); + byte[] buffer = new byte[1024]; + while (!inflater.finished()) { + int count = inflater.inflate(buffer); + outputStream.write(buffer, 0, count); + } + outputStream.close(); + byte[] result = outputStream.toByteArray(); + inflater.end(); + return new String(result, "UTF-8"); + } // 解压缩方法 public static String decompressString(String compressedData) throws IOException, DataFormatException { @@ -66,4 +84,31 @@ public class StringZipUtil { return hexString.toString(); } + public static void main(String[] args){ + + JSONObject one = new JSONObject() + .set("name","张三") + .set("age",12) + .set("opNumber",1) + .set("classNem","中华人民共和国-山东省-济南市-历下区-黄铜四路与凤鸣路1123号-幸福小学7年纪12班") + .set("userId","DSFKJFKLDJSDKLFklwe-23msndf-3242341223"); + log.info("压缩前长度为:{},",one.toJSONString(0).length()); + byte[] zipStr = null; + try { + zipStr = compressString(one.toString()); + log.info("{}",zipStr); + log.info("压缩后长度为:{}",zipStr.length); + }catch (Exception e){ + e.printStackTrace(); + } + + try { + String con = decompressString(zipStr); + log.info("解压缩为:{}",con); + }catch (Exception e){ + e.printStackTrace(); + } + + } + } -- Gitee From 9e2c63a5ade173980efb7d48adbe25b96da03ec9 Mon Sep 17 00:00:00 2001 From: GCC1566 <156654540@qq.com> Date: Sun, 12 Jan 2025 19:17:52 +0800 Subject: [PATCH 14/34] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../redis/server/RedisCacheServer.java | 61 ++++++++++++++++++- .../server/impl/RedisCacheServerImpl.java | 40 ++++++++++++ 2 files changed, 100 insertions(+), 1 deletion(-) diff --git a/redis-component/src/main/java/com/gcc/container/components/redis/server/RedisCacheServer.java b/redis-component/src/main/java/com/gcc/container/components/redis/server/RedisCacheServer.java index 102eb62..12b6836 100644 --- a/redis-component/src/main/java/com/gcc/container/components/redis/server/RedisCacheServer.java +++ b/redis-component/src/main/java/com/gcc/container/components/redis/server/RedisCacheServer.java @@ -44,12 +44,37 @@ public interface RedisCacheServer { */ void setHash(final String key, final Map map); + + /** + * 追加哈希值 + * @param key key + * @param hashKey 哈希键 + * @param hashValue 哈希值 + * @param 值 + */ + void appendHash(final String key,final String hashKey,T hashValue); + /** * 删除哈希表缓存 * @param key 键 */ void removeHash(final String key); + /** + * 删除哈希单个值 + * @param key key + * @param hashKey 键 + */ + void removeHash(final String key,String ...hashKey); + + /** + * 刷新缓存 + * @param key key + * @param newMap 新map + * @param 泛型 + */ + void refreshHash(final String key,final Map newMap); + /** * 读取哈希表 * @param key 键 @@ -67,18 +92,34 @@ public interface RedisCacheServer { /** - * 向列表中添加元素 + * 创建列表缓存 * @param key 键 * @param values 值 */ void addList(final String key, final List values); + /** + * 单个值追加 + * @param key key + * @param values 值 + * @param 泛型 + */ + void addList(final String key,final T ...values); + /** * 删除列表缓存 * @param key 键 */ void removeList(final String key); + /** + * 刷新列表缓存 + * @param key 键 + * @param newValues 新值 + * @param 泛型 + */ + void refreshList(final String key,List newValues); + /** * 获取全部数据 @@ -106,12 +147,30 @@ public interface RedisCacheServer { */ void addSet(final String key, final Set members); + + /** + * 向集合中添加成员 + * @param key 键 + * @param members 成员 + */ + void addSet(final String key, final T ...members); + /** * 删除集合缓存 * @param key 键 */ void removeSet(final String key); + + /** + * 刷新缓存 + * @param key 键 + * @param newMembers 新值 + * @param T + */ + void refreshSet(final String key,final Set newMembers); + + /** * 读取集合中的所有成员 * @param key 键 diff --git a/redis-component/src/main/java/com/gcc/container/components/redis/server/impl/RedisCacheServerImpl.java b/redis-component/src/main/java/com/gcc/container/components/redis/server/impl/RedisCacheServerImpl.java index 7648bba..ac86723 100644 --- a/redis-component/src/main/java/com/gcc/container/components/redis/server/impl/RedisCacheServerImpl.java +++ b/redis-component/src/main/java/com/gcc/container/components/redis/server/impl/RedisCacheServerImpl.java @@ -49,11 +49,28 @@ public class RedisCacheServerImpl implements RedisCacheServer { redisTemplate.opsForHash().putAll(key, map); } + + @Override + public void appendHash(String key, String hashKey, T hashValue) { + redisTemplate.opsForHash().put(key,hashKey,hashValue); + } + @Override public void removeHash(final String key) { redisTemplate.delete(key); } + @Override + public void removeHash(String key, String ...hashKey) { + redisTemplate.opsForHash().delete(key,hashKey); + } + + @Override + public void refreshHash(String key, Map newMap) { + redisTemplate.delete(key); + redisTemplate.opsForHash().putAll(key, newMap); + } + @Override public Map getHash(final String key) { Map entries = redisTemplate.opsForHash().entries(key); @@ -79,11 +96,23 @@ public class RedisCacheServerImpl implements RedisCacheServer { redisTemplate.opsForList().rightPushAll(key, values); } + @Override + public void addList(String key, T... values) { + redisTemplate.opsForList().rightPushAll(key, values); + } + @Override public void removeList(final String key) { redisTemplate.delete(key); } + + @Override + public void refreshList(String key, List newValues) { + redisTemplate.delete(key); + redisTemplate.opsForList().rightPushAll(key, newValues); + } + @Override public List getList(final String key) { Long size = redisTemplate.opsForList().size(key); @@ -104,11 +133,22 @@ public class RedisCacheServerImpl implements RedisCacheServer { redisTemplate.opsForSet().add(key, members.toArray(new Object[0])); } + @Override + public void addSet(String key, T... members) { + redisTemplate.opsForSet().add(key,members); + } + @Override public void removeSet(final String key) { redisTemplate.delete(key); } + @Override + public void refreshSet(String key, Set newMembers) { + redisTemplate.delete(key); + redisTemplate.opsForSet().add(key, newMembers.toArray(new Object[0])); + } + @Override public Set getSet(final String key) { return (Set) redisTemplate.opsForSet().members(key); -- Gitee From eba4c259f9e74b2cfa056558c9194fb1358a9869 Mon Sep 17 00:00:00 2001 From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> Date: Tue, 8 Apr 2025 09:27:15 +0000 Subject: [PATCH 15/34] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=85=AC=E5=85=B1?= =?UTF-8?q?=E5=88=86=E9=A1=B5=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> --- .../web/model/reponse/PageData.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 rest-component/src/main/java/com/gcc/container/components/web/model/reponse/PageData.java diff --git a/rest-component/src/main/java/com/gcc/container/components/web/model/reponse/PageData.java b/rest-component/src/main/java/com/gcc/container/components/web/model/reponse/PageData.java new file mode 100644 index 0000000..a021a3b --- /dev/null +++ b/rest-component/src/main/java/com/gcc/container/components/web/model/reponse/PageData.java @@ -0,0 +1,29 @@ +package com.gcc.container.components.web.model.reponse; + +import lombok.Data; + +import java.io.Serializable; +@Data +public class PageData implements Serializable { + + private long total; + + private T data; + + private int pageNo; + + public PageData(long total, T data) { + this.total = total; + this.data = data; + } + + public PageData(int total, T data) { + this.total = total; + this.data = data; + } + + public PageData pageNo(int pageNo){ + this.pageNo = pageNo; + return this; + } +} -- Gitee From acf525569745619127400b9a14ea58f85e753930 Mon Sep 17 00:00:00 2001 From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> Date: Tue, 8 Apr 2025 09:30:13 +0000 Subject: [PATCH 16/34] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=85=AC=E5=85=B1?= =?UTF-8?q?=E5=88=86=E9=A1=B5=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> --- .../container/components/web/model/reponse/PageData.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rest-component/src/main/java/com/gcc/container/components/web/model/reponse/PageData.java b/rest-component/src/main/java/com/gcc/container/components/web/model/reponse/PageData.java index a021a3b..3e8769e 100644 --- a/rest-component/src/main/java/com/gcc/container/components/web/model/reponse/PageData.java +++ b/rest-component/src/main/java/com/gcc/container/components/web/model/reponse/PageData.java @@ -8,16 +8,16 @@ public class PageData implements Serializable { private long total; - private T data; + private List data; private int pageNo; - public PageData(long total, T data) { + public PageData(long total, List data) { this.total = total; this.data = data; } - public PageData(int total, T data) { + public PageData(int total, List data) { this.total = total; this.data = data; } @@ -26,4 +26,4 @@ public class PageData implements Serializable { this.pageNo = pageNo; return this; } -} +} \ No newline at end of file -- Gitee From 99e1a11b86907e5436f4d50fcaaa5d77ce580319 Mon Sep 17 00:00:00 2001 From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> Date: Tue, 8 Apr 2025 09:30:57 +0000 Subject: [PATCH 17/34] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=85=AC=E5=85=B1?= =?UTF-8?q?=E5=88=86=E9=A1=B5=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> --- .../gcc/container/components/web/model/reponse/PageData.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rest-component/src/main/java/com/gcc/container/components/web/model/reponse/PageData.java b/rest-component/src/main/java/com/gcc/container/components/web/model/reponse/PageData.java index 3e8769e..6ce0d5f 100644 --- a/rest-component/src/main/java/com/gcc/container/components/web/model/reponse/PageData.java +++ b/rest-component/src/main/java/com/gcc/container/components/web/model/reponse/PageData.java @@ -3,6 +3,8 @@ package com.gcc.container.components.web.model.reponse; import lombok.Data; import java.io.Serializable; +import java.util.List; + @Data public class PageData implements Serializable { @@ -26,4 +28,4 @@ public class PageData implements Serializable { this.pageNo = pageNo; return this; } -} \ No newline at end of file +} -- Gitee From 3886b93dc681e4e190ec207a4a3ceb74a79ab15f Mon Sep 17 00:00:00 2001 From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> Date: Fri, 18 Apr 2025 06:45:45 +0000 Subject: [PATCH 18/34] =?UTF-8?q?=E5=85=A8=E5=B1=80=E5=BC=82=E5=B8=B8=20?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> --- .../web/exception/BaseMessException.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 rest-component/src/main/java/com/gcc/container/components/web/exception/BaseMessException.java diff --git a/rest-component/src/main/java/com/gcc/container/components/web/exception/BaseMessException.java b/rest-component/src/main/java/com/gcc/container/components/web/exception/BaseMessException.java new file mode 100644 index 0000000..4b29da1 --- /dev/null +++ b/rest-component/src/main/java/com/gcc/container/components/web/exception/BaseMessException.java @@ -0,0 +1,20 @@ +package com.gcc.container.components.web.exception; + +/** + * 基础消息异常 + */ +public class BaseMessException extends Exception{ + + private final Integer code; + + + public BaseMessException( Integer code,String message) { + super(message); + this.code = code; + } + + + public Integer getCode() { + return code; + } +} -- Gitee From 6d408ebc54d165681d9be682ac54874c3b482291 Mon Sep 17 00:00:00 2001 From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> Date: Fri, 18 Apr 2025 06:46:52 +0000 Subject: [PATCH 19/34] =?UTF-8?q?=E5=85=A8=E5=B1=80=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E6=8B=A6=E6=88=AA=20=E5=85=A8=E5=B1=80API=E6=8B=A6=E6=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> --- .../web/exception/ControllerExceptionAdvice.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/rest-component/src/main/java/com/gcc/container/components/web/exception/ControllerExceptionAdvice.java b/rest-component/src/main/java/com/gcc/container/components/web/exception/ControllerExceptionAdvice.java index ac801d0..e748f3e 100644 --- a/rest-component/src/main/java/com/gcc/container/components/web/exception/ControllerExceptionAdvice.java +++ b/rest-component/src/main/java/com/gcc/container/components/web/exception/ControllerExceptionAdvice.java @@ -68,4 +68,13 @@ public class ControllerExceptionAdvice implements ResponseBodyAdvice { return new Response(ResponseStatus.VALIDATE_ERROR,null); } + //业务提示异常 + @ExceptionHandler({BaseMessException.class}) + public Response BaseMessException(BaseMessException e) + { + // 默认统一返回响应体,填写参数错误编码, 从异常对象中拿到错误信息 + return new Response(e.getCode(),e.getMessage(),null); + } + + } -- Gitee From f03210f8216373a7076e26603f4d15f24d625089 Mon Sep 17 00:00:00 2001 From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> Date: Fri, 18 Apr 2025 06:47:53 +0000 Subject: [PATCH 20/34] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=20=E5=85=A8=E5=B1=80=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E6=8B=A6=E6=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> --- .../components/web/exception/ControllerExceptionAdvice.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rest-component/src/main/java/com/gcc/container/components/web/exception/ControllerExceptionAdvice.java b/rest-component/src/main/java/com/gcc/container/components/web/exception/ControllerExceptionAdvice.java index e748f3e..7c8893b 100644 --- a/rest-component/src/main/java/com/gcc/container/components/web/exception/ControllerExceptionAdvice.java +++ b/rest-component/src/main/java/com/gcc/container/components/web/exception/ControllerExceptionAdvice.java @@ -1,5 +1,6 @@ package com.gcc.container.components.web.exception; + import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.gcc.container.components.web.model.enums.ResponseStatus; @@ -68,7 +69,8 @@ public class ControllerExceptionAdvice implements ResponseBodyAdvice { return new Response(ResponseStatus.VALIDATE_ERROR,null); } - //业务提示异常 + + //业务提示异常 @ExceptionHandler({BaseMessException.class}) public Response BaseMessException(BaseMessException e) { @@ -78,3 +80,4 @@ public class ControllerExceptionAdvice implements ResponseBodyAdvice { } + -- Gitee From 72e3fbccac2eb4e7c97ab701113eb24fee840e22 Mon Sep 17 00:00:00 2001 From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> Date: Fri, 18 Apr 2025 06:57:18 +0000 Subject: [PATCH 21/34] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E6=8B=A6=E6=88=AA=20=E8=A1=A5=E5=85=A8?= =?UTF-8?q?=E5=85=A8=E5=B1=80=E5=BC=82=E5=B8=B8=E6=8B=A6=E6=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> --- .../web/exception/ControllerExceptionAdvice.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/rest-component/src/main/java/com/gcc/container/components/web/exception/ControllerExceptionAdvice.java b/rest-component/src/main/java/com/gcc/container/components/web/exception/ControllerExceptionAdvice.java index 7c8893b..39b1f50 100644 --- a/rest-component/src/main/java/com/gcc/container/components/web/exception/ControllerExceptionAdvice.java +++ b/rest-component/src/main/java/com/gcc/container/components/web/exception/ControllerExceptionAdvice.java @@ -1,6 +1,5 @@ package com.gcc.container.components.web.exception; - import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.gcc.container.components.web.model.enums.ResponseStatus; @@ -13,13 +12,11 @@ import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; import java.util.LinkedHashMap; //仅支持自定义编写的API接口全局拦截 -@RestControllerAdvice(annotations = {GetMapping.class, PostMapping.class}) +@RestControllerAdvice public class ControllerExceptionAdvice implements ResponseBodyAdvice { @Override @@ -78,6 +75,13 @@ public class ControllerExceptionAdvice implements ResponseBodyAdvice { return new Response(e.getCode(),e.getMessage(),null); } + //业务提示异常 + @ExceptionHandler({Exception.class}) + public Response allException(Exception e) + { + // 默认统一返回响应体,填写参数错误编码, 从异常对象中拿到错误信息 + return new Response(ResponseStatus.FAILED,null); + } -} +} -- Gitee From 93affab4279ab8ac78516f8bb37eca8c0a070253 Mon Sep 17 00:00:00 2001 From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> Date: Fri, 18 Apr 2025 09:44:16 +0000 Subject: [PATCH 22/34] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=9B=A0=E5=85=A8?= =?UTF-8?q?=E5=B1=80=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86=E5=8F=8A=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E7=BB=93=E6=9E=9C=E5=B0=81=E8=A3=85=E5=AF=BC=E8=87=B4?= =?UTF-8?q?swagger=E6=97=A0=E6=B3=95=E4=BD=BF=E7=94=A8=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> --- .../components/web/exception/ControllerExceptionAdvice.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rest-component/src/main/java/com/gcc/container/components/web/exception/ControllerExceptionAdvice.java b/rest-component/src/main/java/com/gcc/container/components/web/exception/ControllerExceptionAdvice.java index 39b1f50..e280f4a 100644 --- a/rest-component/src/main/java/com/gcc/container/components/web/exception/ControllerExceptionAdvice.java +++ b/rest-component/src/main/java/com/gcc/container/components/web/exception/ControllerExceptionAdvice.java @@ -1,5 +1,6 @@ package com.gcc.container.components.web.exception; +import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.gcc.container.components.web.model.enums.ResponseStatus; @@ -27,6 +28,11 @@ public class ControllerExceptionAdvice implements ResponseBodyAdvice { @Override public Object beforeBodyWrite(Object data, MethodParameter returnType, MediaType mediaType, Class> aClass, ServerHttpRequest request, ServerHttpResponse response) { + //释放swagger接口页面 + if(StrUtil.containsAny(url,"swagger-resources","api-docs")){ + return data; + } + // String类型不能直接包装 if (returnType.getGenericParameterType().equals(String.class)) { ObjectMapper objectMapper = new ObjectMapper(); -- Gitee From 79129dc67ceabe5961188354ffe081fc34f5234c Mon Sep 17 00:00:00 2001 From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> Date: Wed, 23 Apr 2025 09:42:13 +0000 Subject: [PATCH 23/34] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AD=97=E5=85=B8?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> --- .../web/model/param/DictionaryEnum.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 rest-component/src/main/java/com/gcc/container/components/web/model/param/DictionaryEnum.java diff --git a/rest-component/src/main/java/com/gcc/container/components/web/model/param/DictionaryEnum.java b/rest-component/src/main/java/com/gcc/container/components/web/model/param/DictionaryEnum.java new file mode 100644 index 0000000..542adb4 --- /dev/null +++ b/rest-component/src/main/java/com/gcc/container/components/web/model/param/DictionaryEnum.java @@ -0,0 +1,38 @@ +package com.gcc.container.components.web.model.param; + +import java.io.Serializable; + +/** + * 参数字典枚举 + * @author GCC + */ +public interface DictionaryEnum extends Serializable { + + /** + * 获取编码 + * @return Object + */ + Object getCode(); + + /** + * 获取值 + * @return String + */ + String getValue(); + + + /** + * 根据code获取字典值 + * @param code 编码 + * @return String + */ + String coverValue(Object code); + + /** + * 根据字典值获取字典编码 + * @param value 值 + * @return Object + */ + Object coverCode(String value); + +} -- Gitee From 5a3dfcc1dac5cca193221fa697b82c6a0afa041d Mon Sep 17 00:00:00 2001 From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> Date: Thu, 24 Apr 2025 07:43:57 +0000 Subject: [PATCH 24/34] =?UTF-8?q?=E6=96=B0=E5=A2=9EAPI=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> --- .../components/web/model/RequestLog.java | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 rest-component/src/main/java/com/gcc/container/components/web/model/RequestLog.java diff --git a/rest-component/src/main/java/com/gcc/container/components/web/model/RequestLog.java b/rest-component/src/main/java/com/gcc/container/components/web/model/RequestLog.java new file mode 100644 index 0000000..3006809 --- /dev/null +++ b/rest-component/src/main/java/com/gcc/container/components/web/model/RequestLog.java @@ -0,0 +1,78 @@ +package com.gcc.container.components.web.model; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; +import lombok.Data; +import javax.servlet.http.HttpServletRequest; +import java.io.Serializable; + +@Data +public class RequestLog implements Serializable { + + private String uri; + + private String desc; + + private String method; + + private String host; + + private Object[] param; + + + public RequestLog(HttpServletRequest request){ + this.uri = URLUtil.toURI(request.getRequestURI()).getPath(); + this.method = request.getMethod(); + this.host = buildIpAddress(request); + this.param = buildParam(request); + } + + + public String getparams(){ + StringBuilder stringBuilder = new StringBuilder(); + if(null != this.param){ + for(Object obj:this.param){ + stringBuilder.append(obj).append(" "); + } + } + return stringBuilder.toString(); + } + + private Object[] buildParam(HttpServletRequest request){ + if("get".equalsIgnoreCase(method)){ + String url = request.getRequestURL().toString(); + String query = URLUtil.toURI(url).getQuery(); + if(StrUtil.isNotBlank(query)) { + String[] body = query.split("&"); + return body; + } + } + return null; + } + + private String buildIpAddress(HttpServletRequest request){ + String ip = request.getHeader("x-forward-for"); + if(StrUtil.isBlank(ip) || "unknow".equalsIgnoreCase(ip) ){ + ip = request.getHeader("Proxy-Client-IP"); + } + + if(StrUtil.isBlank(ip) || "unknow".equalsIgnoreCase(ip) ){ + ip = request.getHeader("WL-Proxy-Client-IP"); + } + + if(StrUtil.isBlank(ip) || "unknow".equalsIgnoreCase(ip) ){ + ip = request.getHeader("clientrealip"); + } + + if(StrUtil.isBlank(ip) || "unknow".equalsIgnoreCase(ip) ){ + ip = request.getRemoteAddr(); + } + return ip; + } + + + + + + +} -- Gitee From 1b2ea74d668d669a3d22de6a22cab7faa6516e65 Mon Sep 17 00:00:00 2001 From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> Date: Thu, 24 Apr 2025 07:44:37 +0000 Subject: [PATCH 25/34] =?UTF-8?q?API=E8=AE=B0=E5=BD=95AOP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> --- .../components/web/aspect/ApiNoteAspect.java | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 rest-component/src/main/java/com/gcc/container/components/web/aspect/ApiNoteAspect.java diff --git a/rest-component/src/main/java/com/gcc/container/components/web/aspect/ApiNoteAspect.java b/rest-component/src/main/java/com/gcc/container/components/web/aspect/ApiNoteAspect.java new file mode 100644 index 0000000..30b8d8e --- /dev/null +++ b/rest-component/src/main/java/com/gcc/container/components/web/aspect/ApiNoteAspect.java @@ -0,0 +1,89 @@ +package com.gcc.container.components.web.aspect; + + + + +import javax.servlet.http.HttpServletRequest; + +import com.gcc.container.components.web.model.RequestLog; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.After; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.lang.reflect.Method; + +@Component +@Aspect +@Slf4j(topic = "ApiRequest") +public class ApiNoteAspect { + + @Value("${rest-component.api-log.enable:true}") + private boolean enable; + private final static String LOG_PRE_STR = "\n0000-00-00 00:00:00 INFO [ api-info] ApiRequest : "; + + @After("@annotation(org.springframework.web.bind.annotation.PostMapping)") + public void afterAdvice(JoinPoint point){ + noteApiRequestInfo(point); + } + + @Before("@annotation(org.springframework.web.bind.annotation.GetMapping)") + public void beforeAdvice(JoinPoint point){ + noteApiRequestInfo(point); + } + + + private void noteApiRequestInfo(JoinPoint point){ + if(enable) { + HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.getRequestAttributes())).getRequest(); + RequestLog logEntity = new RequestLog(request); + MethodSignature signature = (MethodSignature) point.getSignature(); + Method method = signature.getMethod(); + ApiOperation desc = method.getAnnotation(ApiOperation.class); + if (null != desc) { + logEntity.setDesc(desc.value()); + } + logEntity.setParam(point.getArgs()); + printInfo(logEntity); + } + } + + + /** + * 输出日志 + * @param logEntity 日志记录 + */ + private void printInfo(RequestLog logEntity){ + + StringBuilder info = new StringBuilder(LOG_PRE_STR); + info.append("================【API Request Start】================") + .append(LOG_PRE_STR) + .append("request-uri :").append(logEntity.getUri()) + .append(LOG_PRE_STR) + .append("request-desc :").append(logEntity.getDesc()) + .append(LOG_PRE_STR) + .append("request-method :").append(logEntity.getMethod()) + .append(LOG_PRE_STR) + .append("request-host :").append(logEntity.getHost()) + .append(LOG_PRE_STR) + .append("request-param :").append(logEntity.getparams()) + .append(LOG_PRE_STR) + .append("================【API Request End】================\n"); + log.info(info.toString()); + } + + + + + + + + +} -- Gitee From 88304c298768562688a20773e78f7ca000541259 Mon Sep 17 00:00:00 2001 From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> Date: Thu, 24 Apr 2025 07:45:30 +0000 Subject: [PATCH 26/34] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> --- rest-component/src/main/resources/application.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rest-component/src/main/resources/application.yml b/rest-component/src/main/resources/application.yml index 26c9e5c..ccce177 100644 --- a/rest-component/src/main/resources/application.yml +++ b/rest-component/src/main/resources/application.yml @@ -1,4 +1,6 @@ rest-component: + api-log: + enable: true api-doc: enable: true packagePath: com.gcc.container.taskschedule.taskscheduling.controller.* -- Gitee From d1db874871bc98352c67041050aef32a176a589f Mon Sep 17 00:00:00 2001 From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> Date: Thu, 24 Apr 2025 07:58:49 +0000 Subject: [PATCH 27/34] =?UTF-8?q?=E8=A1=A5=E5=85=85README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> --- rest-component/README.md | 62 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 rest-component/README.md diff --git a/rest-component/README.md b/rest-component/README.md new file mode 100644 index 0000000..0774821 --- /dev/null +++ b/rest-component/README.md @@ -0,0 +1,62 @@ +# rest-component + +> 基于前后端分离的项目,后端提供统一REST API服务的 Web底座 + +## 组件依赖说明 + +组件整体继承自Components包,所依赖Spring相关组件及通用的公共组件依赖跟随Components版本进行调整管控,相关内容可查看Components的README文档 + +```xml + + com.gcc.container + components + 1.0.0 + +``` + +除基本的SpringAOP、autoconfigure外无其他依赖 + +## 使用说明 + +找到对应版本的Components源码,下载到本地,本地编译安装到私仓中,在你的项目中引入: + +```xml + + + com.gcc.container.components + rest-component + 1.0.0 + +``` + +### yaml配置 + +因该组件是基于包扫描去识别定时任务类和默认以JSON文件的形式去存储项目的定时任务信息,需要通过yaml配置文件来指定包路径和文件的存放路径,引入组件后,可在自己的yml文件中追加: + +```yml +rest-component: + api-log: # API接口调用时是否打印日志 + enable: true #true | false ,默认为true + api-doc: # API 接口文档管理 + enable: true # 是否启用 + packagePath: com.gcc.container.taskschedule.taskscheduling.controller.* #具体的API包路径 + title: XXX服务 #接口文档UI页面名称 + description: 提供XXXX服务 #接口文档UI页面描述 + version: 1.0.0 #版本 +``` + +此处的api-log 包含默认值,所以不进行yml的`rest-task`仍旧可以使用该组件 + +若想使用swagger的接口文档UI说明,建议详细配置api-doc相关内容 + +### 包含功能如下: + +#### API版本管理封装@ApiVersion + + + +#### 统一异常拦截 + + + +#### 接口文档引入 -- Gitee From 1f8742bccc1dd540ec0a985aaf5a8634b5e07ddc Mon Sep 17 00:00:00 2001 From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> Date: Tue, 5 Aug 2025 00:18:35 +0000 Subject: [PATCH 28/34] =?UTF-8?q?update=20AbstractInitDataBase.java.=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=88=90=E5=91=98=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> --- .../action/AbstractInitDataBase.java | 23 ++++--------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/initdatabse-component/src/main/java/com/gcc/container/components/conscript/action/AbstractInitDataBase.java b/initdatabse-component/src/main/java/com/gcc/container/components/conscript/action/AbstractInitDataBase.java index 1f479e8..f8fc19b 100644 --- a/initdatabse-component/src/main/java/com/gcc/container/components/conscript/action/AbstractInitDataBase.java +++ b/initdatabse-component/src/main/java/com/gcc/container/components/conscript/action/AbstractInitDataBase.java @@ -29,7 +29,7 @@ import java.util.Map; @Slf4j public abstract class AbstractInitDataBase implements InitDataBase { - private BaseVersionSQL baseVersionSQLUtil; + private final BaseVersionSQL baseVersionSQLUtil; public Connection commConn = null; @@ -37,9 +37,9 @@ public abstract class AbstractInitDataBase implements InitDataBase { public JSONArray dbConfigFile = new JSONArray(); - public DataBaseProperties dataBaseProperties; + public final DataBaseProperties dataBaseProperties; - public ConscriptProperties conscriptProperties; + public final ConscriptProperties conscriptProperties; public static Boolean flag = false; @@ -331,22 +331,7 @@ public abstract class AbstractInitDataBase implements InitDataBase { } - /** - * 预制建表语句 - * @return String - */ -// private String createVersionTableSQL(){ -// return "CREATE TABLE "+conscriptProperties.getTableName()+" (\n" + -// " version VARCHAR(10),\n" + -// " desc TEXT,\n" + -// " sql_name TEXT,\n" + -// " sql_size INT,\n" + -// " execute_time VARCHAR(50)\n" + ");"; -// } - -// private String initDataVersionTableSQL(){ -// return "INSERT INTO "+conscriptProperties.getTableName()+" VALUES ('0.0','init conscript','inner.sql',2,'1900-01-01 00:00:00');"; -// } + -- Gitee From 9a58e70c9114125728324151a2a7421adadb332a Mon Sep 17 00:00:00 2001 From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> Date: Fri, 22 Aug 2025 01:41:04 +0000 Subject: [PATCH 29/34] =?UTF-8?q?update=20task-component/src/main/java/com?= =?UTF-8?q?/gcc/container/components/task/compont/TaskScheduleImpl.java.?= =?UTF-8?q?=20=E4=BC=98=E5=8C=96=E7=BA=BF=E7=A8=8B=E6=B1=A0=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com> --- .../container/components/task/compont/TaskScheduleImpl.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/task-component/src/main/java/com/gcc/container/components/task/compont/TaskScheduleImpl.java b/task-component/src/main/java/com/gcc/container/components/task/compont/TaskScheduleImpl.java index 1272500..448144a 100644 --- a/task-component/src/main/java/com/gcc/container/components/task/compont/TaskScheduleImpl.java +++ b/task-component/src/main/java/com/gcc/container/components/task/compont/TaskScheduleImpl.java @@ -1,6 +1,6 @@ package com.gcc.container.components.task.compont; - +import cn.hutool.core.util.NumberUtil; import com.gcc.container.components.task.dao.TaskRepository; import com.gcc.container.components.task.model.entity.TaskEntity; import com.gcc.container.components.task.model.enums.TaskLevel; @@ -66,7 +66,8 @@ public class TaskScheduleImpl implements TaskSchedule { @Override public void initScheduling() { int num = taskFactory.mergeTaskEntities().size(); - num = num > 0 ? num:1; + num = NumberUtil.max(num,1); + num = NumberUtil.min(num,10); this.threadPoolTaskScheduler.setPoolSize(num); this.threadPoolTaskScheduler.setThreadNamePrefix("task-thread-"); this.threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(true); -- Gitee From e2f816302357096a856614e45bbdc0cd9853b2b1 Mon Sep 17 00:00:00 2001 From: GCC1566 <156654540@qq.com> Date: Sat, 30 Aug 2025 20:32:25 +0800 Subject: [PATCH 30/34] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B8=BA=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E7=9B=91=E5=90=AC=E5=A4=9A=E4=B8=AA=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/consumer/AbstracTopicConsumer.java | 14 ++++++++++---- .../consumer/AbstractTopicObserver.java | 12 ++++++------ .../kafka/component/consumer/InitConsumer.java | 9 +++++---- .../component/consumer/RegistrationHelper.java | 16 ++++++++++------ .../kafka/component/consumer/TopicObserver.java | 2 +- 5 files changed, 32 insertions(+), 21 deletions(-) diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstracTopicConsumer.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstracTopicConsumer.java index 1d5f2cf..40ef322 100644 --- a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstracTopicConsumer.java +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstracTopicConsumer.java @@ -1,17 +1,23 @@ package com.gcc.container.components.kafka.component.consumer; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + /** * 抽象消费者 */ public abstract class AbstracTopicConsumer implements TopicConsumer{ - private String topic; + private final List topic = new ArrayList<>(0); - public AbstracTopicConsumer(String topic) { - this.topic = topic; + public AbstracTopicConsumer(String ...topics) { + if(null != topics){ + Collections.addAll(topic, topics); + } } - public String getTopic() { + public List getTopics() { return topic; } diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstractTopicObserver.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstractTopicObserver.java index 8e6df3a..9c99160 100644 --- a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstractTopicObserver.java +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstractTopicObserver.java @@ -12,8 +12,8 @@ import java.util.List; public abstract class AbstractTopicObserver implements TopicObserver, InitializingBean { private static final Logger log = LoggerFactory.getLogger("TopicObserver"); - private String topic; - private List consumers = new ArrayList<>(); + private final String topic; + private final List listeners = new ArrayList<>(); public AbstractTopicObserver(String topic) { this.topic = topic; @@ -24,15 +24,15 @@ public abstract class AbstractTopicObserver implements TopicObserver, Initializi } @Override - public void addLinstener(TopicConsumer consumer) { - consumers.add(consumer); + public void addConsumer(TopicConsumer consumer) { + listeners.add(consumer); } @Override public void noticeConsumer(Consumer messageObject, Acknowledgment acknowledgment) { - log.info("message :{}", JSONUtil.parseObj(messageObject).toJSONString(0)); + log.debug("message :{}", JSONUtil.parseObj(messageObject).toJSONString(0)); try { - for (TopicConsumer consumer:consumers){ + for (TopicConsumer consumer: listeners){ consumer.onMessage(messageObject); } if(null != acknowledgment){ diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/InitConsumer.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/InitConsumer.java index 1f4bf76..4765869 100644 --- a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/InitConsumer.java +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/InitConsumer.java @@ -1,5 +1,6 @@ package com.gcc.container.components.kafka.component.consumer; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.event.ApplicationReadyEvent; @@ -12,13 +13,13 @@ import java.util.Map; @Slf4j @Component +@AllArgsConstructor public class InitConsumer { - @Autowired - private ApplicationContext context; + private final ApplicationContext context; - @Autowired - private KafkaListenerEndpointRegistry registry; + + private final KafkaListenerEndpointRegistry registry; @EventListener public void onApplicationEvent(ApplicationReadyEvent event){ diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/RegistrationHelper.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/RegistrationHelper.java index ead4102..12d97f4 100644 --- a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/RegistrationHelper.java +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/RegistrationHelper.java @@ -2,6 +2,7 @@ package com.gcc.container.components.kafka.component.consumer; import lombok.extern.slf4j.Slf4j; +import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -12,18 +13,21 @@ import java.util.concurrent.ConcurrentMap; @Slf4j public class RegistrationHelper { - private final static ConcurrentMap observerContext = new ConcurrentHashMap<>(); + private final static ConcurrentMap OBSERVER_CONTEXT = new ConcurrentHashMap<>(); public static void registerObserver(AbstractTopicObserver observer){ - observerContext.put(observer.getTopic(),observer); + OBSERVER_CONTEXT.put(observer.getTopic(),observer); } public static void registerConsumer(AbstracTopicConsumer consumer){ - if(observerContext.containsKey(consumer.getTopic())){ - observerContext.get(consumer.getTopic()).addLinstener(consumer); - }else { - log.warn(" consumer of topic ‘{}’ register fail,no this observer",consumer.getTopic()); + List topics = consumer.getTopics(); + for(String topic:topics) { + if (OBSERVER_CONTEXT.containsKey(topic)) { + OBSERVER_CONTEXT.get(topic).addConsumer(consumer); + } else { + log.warn(" consumer of topic ‘{}’ register fail,no this observer",topic); + } } } diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicObserver.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicObserver.java index 5d0823c..6328334 100644 --- a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicObserver.java +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicObserver.java @@ -9,7 +9,7 @@ interface TopicObserver { * 新增消费者 * @param consumer 消费者 */ - void addLinstener(TopicConsumer consumer); + void addConsumer(TopicConsumer consumer); /** * 通知消费之 -- Gitee From f7c60b0f06d16997f4b4ae12644d1f740c04f075 Mon Sep 17 00:00:00 2001 From: GCC1566 <156654540@qq.com> Date: Sat, 30 Aug 2025 22:27:21 +0800 Subject: [PATCH 31/34] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B8=BA=E5=BC=82?= =?UTF-8?q?=E6=AD=A5=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kafka/ApplicationConfiguration.java | 2 + .../consumer/AbstracTopicConsumer.java | 98 ++++++++++++++++++- .../consumer/AbstractTopicObserver.java | 22 ++--- .../component/consumer/InitConsumer.java | 23 ++--- .../component/consumer/TopicConsumer.java | 8 +- .../component/consumer/TopicObserver.java | 8 +- .../configure/ApplicationContextHandler.java | 31 ++++++ 7 files changed, 150 insertions(+), 42 deletions(-) create mode 100644 kafka-component/src/main/java/com/gcc/container/components/kafka/configure/ApplicationContextHandler.java diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/ApplicationConfiguration.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/ApplicationConfiguration.java index a8bc650..05ba1df 100644 --- a/kafka-component/src/main/java/com/gcc/container/components/kafka/ApplicationConfiguration.java +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/ApplicationConfiguration.java @@ -2,9 +2,11 @@ package com.gcc.container.components.kafka; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; @Configuration @EnableScheduling +@EnableAsync @ComponentScan(basePackages = "com.gcc.container.components.kafka.*") public class ApplicationConfiguration { } diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstracTopicConsumer.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstracTopicConsumer.java index 40ef322..aa580dc 100644 --- a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstracTopicConsumer.java +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstracTopicConsumer.java @@ -1,16 +1,31 @@ package com.gcc.container.components.kafka.component.consumer; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.DisposableBean; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; /** * 抽象消费者 */ -public abstract class AbstracTopicConsumer implements TopicConsumer{ - +@Slf4j +public abstract class AbstracTopicConsumer implements TopicConsumer,Runnable, DisposableBean { + /** + * 缓冲管道,防止Kafka消息堆积 + */ + private final BlockingQueue BUFFER_PIPE = new LinkedBlockingQueue<>(10000); private final List topic = new ArrayList<>(0); + /** + * 添加线程引用 + */ + private Thread consumerThread; + + private volatile boolean consumerInitialized = false; public AbstracTopicConsumer(String ...topics) { if(null != topics){ Collections.addAll(topic, topics); @@ -21,4 +36,83 @@ public abstract class AbstracTopicConsumer implements TopicConsumer{ return topic; } + @Override + public void onMessage(String messageObj) { + try { + if(!BUFFER_PIPE.offer(messageObj)){ + log.warn("BUFFER_PIPE is full !this message will be discarded,message={},from{}",messageObj,this.getClass().getName()); + } + initConsumerThread(); + }catch (Exception e){ + log.error("consumer[{}] message of {} consume fail",this.getClass().getName(),messageObj); + } + } + + /** + * 实现Runnable接口的run方法 + */ + @Override + public void run() { + while (!Thread.currentThread().isInterrupted()) { + try { + String msg = BUFFER_PIPE.take(); + dealMessage(msg); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + log.error("Consumer thread interrupted, stopping processing for {}", + this.getClass().getSimpleName()); + break; + } catch (Exception e) { + log.error("Error processing message in consumer: {}", e.getMessage(), e); + } + } + } + + + @Override + public void destroy() throws Exception { + log.info("Shutting down consumer: {}", this.getClass().getSimpleName()); + shutdown(); + } + + /** + * 提供关闭消费者线程的方法 + */ + public void shutdown() { + if (consumerThread != null && consumerThread.isAlive()) { + consumerThread.interrupt(); + try { + consumerThread.join(5000); // 等待最多5秒 + log.info("Consumer thread stopped for {}", this.getClass().getSimpleName()); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + log.warn("Interrupted while waiting for consumer thread to stop"); + } + } + } + + private void initConsumerThread() { + if (!consumerInitialized) { + synchronized (this) { + if (!consumerInitialized) { + // 创建线程并传入this作为Runnable + consumerThread = new Thread(this); + consumerThread.setName("Consumer-" + this.getClass().getSimpleName()); + consumerThread.setDaemon(true); + consumerThread.start(); + consumerInitialized = true; + log.info("Consumer thread started for {}", this.getClass().getSimpleName()); + } + } + } + } + + /** + * 真正处理消息对象 + * @param messageObj 消息体 + */ + abstract void dealMessage(String messageObj); + + + } diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstractTopicObserver.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstractTopicObserver.java index 9c99160..fdf4ec6 100644 --- a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstractTopicObserver.java +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/AbstractTopicObserver.java @@ -1,12 +1,8 @@ package com.gcc.container.components.kafka.component.consumer; -import cn.hutool.json.JSONUtil; -import org.apache.kafka.clients.consumer.Consumer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; -import org.springframework.kafka.support.Acknowledgment; - import java.util.ArrayList; import java.util.List; @@ -29,17 +25,15 @@ public abstract class AbstractTopicObserver implements TopicObserver, Initializi } @Override - public void noticeConsumer(Consumer messageObject, Acknowledgment acknowledgment) { - log.debug("message :{}", JSONUtil.parseObj(messageObject).toJSONString(0)); - try { - for (TopicConsumer consumer: listeners){ - consumer.onMessage(messageObject); - } - if(null != acknowledgment){ - acknowledgment.acknowledge(); + public void noticeConsumer(String message) { + log.debug("message :{}", message); + for (TopicConsumer consumer: listeners){ + String copyMessage = String.valueOf(message); + try { + consumer.onMessage(copyMessage); + }catch (Exception e){ + log.error("message of {} consume fail.message={}",topic,copyMessage); } - }catch (Exception e){ - log.error("message of {} consume fail",topic); } } diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/InitConsumer.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/InitConsumer.java index 4765869..fc3c20a 100644 --- a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/InitConsumer.java +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/InitConsumer.java @@ -1,41 +1,30 @@ package com.gcc.container.components.kafka.component.consumer; +import com.gcc.container.components.kafka.configure.ApplicationContextHandler; import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.event.ApplicationReadyEvent; -import org.springframework.context.ApplicationContext; import org.springframework.context.event.EventListener; import org.springframework.kafka.config.KafkaListenerEndpointRegistry; import org.springframework.kafka.listener.MessageListenerContainer; import org.springframework.stereotype.Component; import java.util.Map; -@Slf4j @Component @AllArgsConstructor public class InitConsumer { - private final ApplicationContext context; - - private final KafkaListenerEndpointRegistry registry; @EventListener public void onApplicationEvent(ApplicationReadyEvent event){ - registerAllConsumer(); + Map beans = ApplicationContextHandler.getApplicationContext().getBeansOfType(AbstracTopicConsumer.class); + for (Map.Entry entry : beans.entrySet()) { + RegistrationHelper.registerConsumer(entry.getValue()); + } + //开启所有的消费者 for (MessageListenerContainer container : registry.getListenerContainers()) { container.start(); } } - private void registerAllConsumer(){ - // 获取所有BaseService类型的bean - Map beans = context.getBeansOfType(AbstracTopicConsumer.class); - // 打印每个找到的bean的名字及其toString()输出 - for (Map.Entry entry : beans.entrySet()) { - RegistrationHelper.registerConsumer(entry.getValue()); - } - } - } diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicConsumer.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicConsumer.java index 3d36ccc..6695a20 100644 --- a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicConsumer.java +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicConsumer.java @@ -1,6 +1,5 @@ package com.gcc.container.components.kafka.component.consumer; -import org.apache.kafka.clients.consumer.Consumer; /** * 具体的消费者 @@ -8,9 +7,12 @@ import org.apache.kafka.clients.consumer.Consumer; */ interface TopicConsumer { /** - * 处理消息对象 + * 响应消息对象 * @param messageObj 消息对象 */ - void onMessage(Consumer messageObj); + void onMessage(String messageObj); + + + } diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicObserver.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicObserver.java index 6328334..6f83722 100644 --- a/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicObserver.java +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/component/consumer/TopicObserver.java @@ -1,8 +1,5 @@ package com.gcc.container.components.kafka.component.consumer; -import org.apache.kafka.clients.consumer.Consumer; -import org.springframework.kafka.support.Acknowledgment; - interface TopicObserver { /** @@ -13,9 +10,8 @@ interface TopicObserver { /** * 通知消费之 - * @param messageObject 消息 - * @param acknowledgment 事务控制 + * @param message 消息 */ - void noticeConsumer(Consumer messageObject, Acknowledgment acknowledgment); + void noticeConsumer(String message); } diff --git a/kafka-component/src/main/java/com/gcc/container/components/kafka/configure/ApplicationContextHandler.java b/kafka-component/src/main/java/com/gcc/container/components/kafka/configure/ApplicationContextHandler.java new file mode 100644 index 0000000..f701be1 --- /dev/null +++ b/kafka-component/src/main/java/com/gcc/container/components/kafka/configure/ApplicationContextHandler.java @@ -0,0 +1,31 @@ +package com.gcc.container.components.kafka.configure; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +@Component +public class ApplicationContextHandler implements ApplicationContextAware { + + private static ApplicationContext applicationContext; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + ApplicationContextHandler.applicationContext = applicationContext; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + + + public static T getBean(Class clazz) { + return applicationContext.getBean(clazz); + } + + public static T getBean(String name, Class clazz) { + return applicationContext.getBean(name, clazz); + } + +} -- Gitee From e954f878142e3714a720d120c45c979b4b3b7a2c Mon Sep 17 00:00:00 2001 From: GCC1566 <156654540@qq.com> Date: Sat, 6 Sep 2025 14:28:34 +0800 Subject: [PATCH 32/34] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E9=93=BE=E6=8E=A5=E7=9A=84=E8=B5=84=E6=BA=90=E9=87=8A?= =?UTF-8?q?=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../conscript/action/dm/DaMengDataBase.java | 35 +++++++---------- .../action/kingbase8/KingBase8DataBase.java | 36 +++++++----------- .../conscript/action/mysql/MySqlDataBase.java | 33 +++++++--------- .../action/pgsql/PostgreSQLDataBase.java | 38 ++++++++----------- 4 files changed, 56 insertions(+), 86 deletions(-) diff --git a/initdatabse-component/src/main/java/com/gcc/container/components/conscript/action/dm/DaMengDataBase.java b/initdatabse-component/src/main/java/com/gcc/container/components/conscript/action/dm/DaMengDataBase.java index 2f729ed..f381b98 100644 --- a/initdatabse-component/src/main/java/com/gcc/container/components/conscript/action/dm/DaMengDataBase.java +++ b/initdatabse-component/src/main/java/com/gcc/container/components/conscript/action/dm/DaMengDataBase.java @@ -5,10 +5,7 @@ import com.gcc.container.components.conscript.model.ConscriptProperties; import com.gcc.container.components.conscript.model.DataBaseProperties; import lombok.extern.slf4j.Slf4j; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.Statement; +import java.sql.*; @Slf4j public class DaMengDataBase extends AbstractInitDataBase { @@ -20,11 +17,10 @@ public class DaMengDataBase extends AbstractInitDataBase { @Override public void initCommConn() { try{ - Class.forName(dataBaseProperties.getDriverClassName()); String jdbcUrl = "jdbc:dm://" + dataBaseProperties.getHost() + ":"+dataBaseProperties.getDbport(); commConn = DriverManager.getConnection(jdbcUrl,dataBaseProperties.getRootUser(),dataBaseProperties.getRootPass()); commConn.setAutoCommit(true); - }catch (Exception e){ + }catch (SQLException e){ log.error("【Conscript】Database initialization :data base is not connection....."); } } @@ -32,43 +28,40 @@ public class DaMengDataBase extends AbstractInitDataBase { @Override public void initDbConn() { try{ - Class.forName(dataBaseProperties.getDriverClassName()); String jdbcUrl = "jdbc:dm://" + dataBaseProperties.getHost() + ":"+dataBaseProperties.getDbport()+"?schema="+dataBaseProperties.getSchema(); dbConn = DriverManager.getConnection(jdbcUrl,dataBaseProperties.getUsername(),dataBaseProperties.getPassword()); dbConn.setAutoCommit(true); - }catch (Exception e){ + }catch (SQLException e){ log.error("【Conscript】Database initialization :data base is not connection....."); } } @Override public boolean databaseIsExist(Connection connection) { - try { - Statement stmt = connection.createStatement(); - ResultSet res = stmt.executeQuery("SELECT COUNT(DISTINCT object_name) AS NUM FROM ALL_OBJECTS WHERE object_type = 'SCH' AND object_name = '"+dataBaseProperties.getSchema()+"'"); + boolean flag = true; + try( Statement stmt = connection.createStatement(); + ResultSet res = stmt.executeQuery("SELECT COUNT(DISTINCT object_name) AS NUM FROM ALL_OBJECTS WHERE object_type = 'SCH' AND object_name = '"+dataBaseProperties.getSchema()+"'")){ if(res.next() && res.getInt(1) == 0){ stmt.close(); - return false; + flag = false; } - return true; - }catch (Exception e){ + }catch (SQLException e){ log.error("【Conscript】Database initialization :database base query is error"); } - return false; + return flag; } @Override public boolean createDataBase() { - try { - Statement stmt = commConn.createStatement(); + boolean flag = true; + try(Statement stmt = commConn.createStatement()){ stmt.execute("CREATE SCHEMA \""+dataBaseProperties.getSchema()+"\" AUTHORIZATION \""+dataBaseProperties.getUsername()+"\" "); - stmt.close(); - }catch (Exception e){ + }catch (SQLException e){ log.error("【Conscript】Create {} Database Failed !!",dataBaseProperties.getDbName()); - return false; + flag = false; } - return true; + return flag; } } diff --git a/initdatabse-component/src/main/java/com/gcc/container/components/conscript/action/kingbase8/KingBase8DataBase.java b/initdatabse-component/src/main/java/com/gcc/container/components/conscript/action/kingbase8/KingBase8DataBase.java index 17afb45..5901873 100644 --- a/initdatabse-component/src/main/java/com/gcc/container/components/conscript/action/kingbase8/KingBase8DataBase.java +++ b/initdatabse-component/src/main/java/com/gcc/container/components/conscript/action/kingbase8/KingBase8DataBase.java @@ -5,10 +5,7 @@ import com.gcc.container.components.conscript.model.ConscriptProperties; import com.gcc.container.components.conscript.model.DataBaseProperties; import lombok.extern.slf4j.Slf4j; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.Statement; +import java.sql.*; @Slf4j public class KingBase8DataBase extends AbstractInitDataBase { @@ -21,11 +18,10 @@ public class KingBase8DataBase extends AbstractInitDataBase { @Override public void initCommConn() { try{ - Class.forName(dataBaseProperties.getDriverClassName()); String jdbcUrl = "jdbc:kingbase8://" + dataBaseProperties.getHost() + ":"+dataBaseProperties.getDbport()+"/TEST"; commConn = DriverManager.getConnection(jdbcUrl,dataBaseProperties.getRootUser(),dataBaseProperties.getRootPass()); commConn.setAutoCommit(true); - }catch (Exception e){ + }catch (SQLException e){ log.error("【Conscript】Database initialization :data base is not connection....."); } } @@ -33,42 +29,38 @@ public class KingBase8DataBase extends AbstractInitDataBase { @Override public void initDbConn() { try{ - Class.forName(dataBaseProperties.getDriverClassName()); String jdbcUrl = "jdbc:kingbase8://" + dataBaseProperties.getHost() + ":"+dataBaseProperties.getDbport()+"/"+dataBaseProperties.getDbName()+"??currentSchema="+dataBaseProperties.getSchema()+"&characterEncoding=utf-8"; dbConn = DriverManager.getConnection(jdbcUrl,dataBaseProperties.getUsername(),dataBaseProperties.getPassword()); dbConn.setAutoCommit(true); - }catch (Exception e){ + }catch (SQLException e){ log.error("【Conscript】Database initialization :data base is not connection....."); } } @Override public boolean createDataBase() { - try { - Statement stmt = commConn.createStatement(); + boolean flag = true; + try( Statement stmt = commConn.createStatement()){ stmt.execute("CREATE DATABASE "+dataBaseProperties.getDbName()+" OWNER "+dataBaseProperties.getUsername()+" encoding 'utf8' CONNECTION LIMIT 10"); stmt.execute("CREATE SCHEMA \""+dataBaseProperties.getSchema()+"\" AUTHORIZATION \""+dataBaseProperties.getUsername()+"\" "); - stmt.close(); - }catch (Exception e){ + }catch (SQLException e){ log.error("【Conscript】Create {} Database Fail!",dataBaseProperties.getDbName()); - return false; + flag = false; } - return true; + return flag; } @Override public boolean databaseIsExist(Connection connection) { - try { - Statement stmt = connection.createStatement(); - ResultSet res = stmt.executeQuery("SELECT DATNAME FROM sys_database WHERE DATNAME = '"+dataBaseProperties.getDbName()+"'"); + boolean flag = true; + try( Statement stmt = connection.createStatement(); + ResultSet res = stmt.executeQuery("SELECT DATNAME FROM sys_database WHERE DATNAME = '"+dataBaseProperties.getDbName()+"'")){ if(!res.next()){ - stmt.close(); - return false; + flag = false; } - return true; - }catch (Exception e){ + }catch (SQLException e){ log.error("【Conscript】Database initialization :database base query is error"); } - return false; + return flag; } } diff --git a/initdatabse-component/src/main/java/com/gcc/container/components/conscript/action/mysql/MySqlDataBase.java b/initdatabse-component/src/main/java/com/gcc/container/components/conscript/action/mysql/MySqlDataBase.java index 997fb40..f3c5a44 100644 --- a/initdatabse-component/src/main/java/com/gcc/container/components/conscript/action/mysql/MySqlDataBase.java +++ b/initdatabse-component/src/main/java/com/gcc/container/components/conscript/action/mysql/MySqlDataBase.java @@ -5,10 +5,7 @@ import com.gcc.container.components.conscript.model.ConscriptProperties; import com.gcc.container.components.conscript.model.DataBaseProperties; import lombok.extern.slf4j.Slf4j; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.Statement; +import java.sql.*; /** * Mysql数据库初始化类 @@ -24,10 +21,9 @@ public class MySqlDataBase extends AbstractInitDataBase { @Override public void initCommConn() { try { - Class.forName(dataBaseProperties.getDriverClassName()); String jdbcUrl = "jdbc:mysql://" + dataBaseProperties.getHost() + ":" + dataBaseProperties.getDbport() + "/mysql?characterEncoding=utf8&serverTimezone=GMT%2B8"; commConn = DriverManager.getConnection(jdbcUrl, dataBaseProperties.getRootUser(), dataBaseProperties.getRootPass()); - }catch (Exception e){ + }catch (SQLException e){ log.error("【Conscript】Database initialization :data base is not connection....."); } } @@ -44,31 +40,28 @@ public class MySqlDataBase extends AbstractInitDataBase { @Override public boolean databaseIsExist(Connection connection){ - try { - Statement stmt = connection.createStatement(); - ResultSet res = stmt.executeQuery("SELECT COUNT(*) FROM information_schema.schemata WHERE schema_name= \""+ dataBaseProperties.getDbName()+"\""); + boolean flag = true; + try(Statement stmt = connection.createStatement(); + ResultSet res = stmt.executeQuery("SELECT COUNT(*) FROM information_schema.schemata WHERE schema_name= \""+ dataBaseProperties.getDbName()+"\"")){ if(res.next() && res.getInt(1) == 0){ - stmt.close(); - return false; + flag = false; } - return true; - }catch (Exception e){ + }catch (SQLException e){ log.error("【Conscript】Database initialization :database base query is error"); } - return false; + return flag; } @Override public boolean createDataBase() { - try { - Statement stmt = commConn.createStatement(); + boolean flag = true; + try( Statement stmt = commConn.createStatement()){ stmt.execute("CREATE DATABASE IF NOT EXISTS "+ dataBaseProperties.getDbName()+" DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci"); - stmt.close(); - }catch (Exception e){ + }catch (SQLException e){ log.error("【Conscript】Create {} Database Failed !!",dataBaseProperties.getDbName()); - return false; + flag = false; } - return true; + return flag; } diff --git a/initdatabse-component/src/main/java/com/gcc/container/components/conscript/action/pgsql/PostgreSQLDataBase.java b/initdatabse-component/src/main/java/com/gcc/container/components/conscript/action/pgsql/PostgreSQLDataBase.java index 4457848..4c5b0ca 100644 --- a/initdatabse-component/src/main/java/com/gcc/container/components/conscript/action/pgsql/PostgreSQLDataBase.java +++ b/initdatabse-component/src/main/java/com/gcc/container/components/conscript/action/pgsql/PostgreSQLDataBase.java @@ -5,10 +5,7 @@ import com.gcc.container.components.conscript.model.ConscriptProperties; import com.gcc.container.components.conscript.model.DataBaseProperties; import lombok.extern.slf4j.Slf4j; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.Statement; +import java.sql.*; @Slf4j public class PostgreSQLDataBase extends AbstractInitDataBase { @@ -20,10 +17,9 @@ public class PostgreSQLDataBase extends AbstractInitDataBase { @Override public void initCommConn() { try { - Class.forName(dataBaseProperties.getDriverClassName()); String url = "jdbc:postgresql://"+dataBaseProperties.getHost()+":"+dataBaseProperties.getDbport()+"/postgres"; commConn = DriverManager.getConnection(url, dataBaseProperties.getRootUser(), dataBaseProperties.getRootPass()); - }catch (Exception e){ + }catch (SQLException e){ log.error("【Conscript】Database initialization :data base is not connection....."); } } @@ -31,40 +27,36 @@ public class PostgreSQLDataBase extends AbstractInitDataBase { @Override public void initDbConn() { try { - Class.forName(dataBaseProperties.getDriverClassName()); dbConn = DriverManager.getConnection(dataBaseProperties.getUrl(), dataBaseProperties.getUsername(), dataBaseProperties.getPassword()); - }catch (Exception e){ + }catch (SQLException e){ log.error("【Conscript】Database initialization :data base {} is not connection.....",dataBaseProperties.getDbName()); } } @Override public boolean databaseIsExist(Connection connection) { - try { - Statement stmt = connection.createStatement(); - ResultSet res = stmt.executeQuery("SELECT datname FROM pg_database WHERE datname =\'"+ dataBaseProperties.getDbName()+"\'"); - if(!res.next()){ - stmt.close(); - return false; + boolean flag = true; + try(Statement stmt = connection.createStatement(); + ResultSet res = stmt.executeQuery("SELECT datname FROM pg_database WHERE datname =\'"+ dataBaseProperties.getDbName()+"\'")){ + if(res.next() && res.getInt(1) == 0){ + flag = false; } - return true; - }catch (Exception e){ + }catch (SQLException e){ log.error("【Conscript】Database initialization :database base query is error"); } - return false; + return flag; } @Override public boolean createDataBase() { - try { - Statement stmt = commConn.createStatement(); + boolean flag = true; + try( Statement stmt = commConn.createStatement()){ stmt.execute("CREATE DATABASE "+ dataBaseProperties.getDbName()+" WITH OWNER = "+dataBaseProperties.getUsername()+" ENCODING = 'UTF-8' "); - stmt.close(); - }catch (Exception e){ + }catch (SQLException e){ log.error("【Conscript】Create {} Database Failed !!",dataBaseProperties.getDbName()); - return false; + flag = false; } - return true; + return flag; } -- Gitee From 074a7b259165e8e328d86524f3003291ee3ed414 Mon Sep 17 00:00:00 2001 From: GCC1566 <156654540@qq.com> Date: Sat, 6 Sep 2025 14:38:13 +0800 Subject: [PATCH 33/34] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=B3=A8=E5=85=A5=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InitTaskSchedulingApplication.java | 18 ++----- .../components/task/compont/TaskFactory.java | 30 ++++-------- .../task/compont/TaskScheduleImpl.java | 48 ++++++++----------- 3 files changed, 32 insertions(+), 64 deletions(-) diff --git a/task-component/src/main/java/com/gcc/container/components/task/compont/InitTaskSchedulingApplication.java b/task-component/src/main/java/com/gcc/container/components/task/compont/InitTaskSchedulingApplication.java index f9199ef..78cac8e 100644 --- a/task-component/src/main/java/com/gcc/container/components/task/compont/InitTaskSchedulingApplication.java +++ b/task-component/src/main/java/com/gcc/container/components/task/compont/InitTaskSchedulingApplication.java @@ -1,6 +1,7 @@ package com.gcc.container.components.task.compont; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; @@ -15,23 +16,12 @@ import org.springframework.stereotype.Component; @Order(1) @Slf4j @Component +@AllArgsConstructor public class InitTaskSchedulingApplication implements ApplicationRunner { - private TaskSchedule taskSchedule; + private final TaskSchedule taskSchedule; - - private TaskFactory taskFactory; - - - @Autowired - public void setTaskScheduleServer(TaskSchedule taskSchedule) { - this.taskSchedule = taskSchedule; - } - - @Autowired - public void setTaskTempFactory(TaskFactory taskFactory) { - this.taskFactory = taskFactory; - } + private final TaskFactory taskFactory; @Override public void run(ApplicationArguments args) throws Exception { diff --git a/task-component/src/main/java/com/gcc/container/components/task/compont/TaskFactory.java b/task-component/src/main/java/com/gcc/container/components/task/compont/TaskFactory.java index 1cabd5e..f03ea32 100644 --- a/task-component/src/main/java/com/gcc/container/components/task/compont/TaskFactory.java +++ b/task-component/src/main/java/com/gcc/container/components/task/compont/TaskFactory.java @@ -11,7 +11,7 @@ import com.gcc.container.components.task.dao.TaskRepository; import com.gcc.container.components.task.model.entity.TaskEntity; import com.gcc.container.components.task.model.enums.TaskLevel; import com.gcc.container.components.task.property.TaskDataProperties; -import org.springframework.beans.factory.annotation.Autowired; +import lombok.AllArgsConstructor; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; @@ -24,38 +24,24 @@ import java.util.*; import java.util.stream.Collectors; @Component -class TaskFactory { +@AllArgsConstructor +class TaskFactory{ - private ApplicationContext context; + private final ApplicationContext context; - private TaskRepository taskRepository; + private final TaskRepository taskRepository; - private TaskDataProperties taskDataProperties; + private final TaskDataProperties taskDataProperties; public final String CLASS_PATH = "com.gcc.container.components.task.compont.BaseMethodLevelTask"; - private List tempContainer = new ArrayList<>(); + private final List tempContainer = new ArrayList<>(); - @Autowired - public void setContext(ApplicationContext context) { - this.context = context; - } - - @Autowired - public void setTaskRepository(TaskRepository taskRepository) { - this.taskRepository = taskRepository; - } - - @Autowired - public void setTaskDataProperties(TaskDataProperties taskDataProperties) { - this.taskDataProperties = taskDataProperties; - } - public void scanTaskInfo() throws Exception { //扫描类级任务 @@ -192,4 +178,6 @@ class TaskFactory { } return 0; } + + } diff --git a/task-component/src/main/java/com/gcc/container/components/task/compont/TaskScheduleImpl.java b/task-component/src/main/java/com/gcc/container/components/task/compont/TaskScheduleImpl.java index 448144a..0f8b89a 100644 --- a/task-component/src/main/java/com/gcc/container/components/task/compont/TaskScheduleImpl.java +++ b/task-component/src/main/java/com/gcc/container/components/task/compont/TaskScheduleImpl.java @@ -4,13 +4,12 @@ import cn.hutool.core.util.NumberUtil; import com.gcc.container.components.task.dao.TaskRepository; import com.gcc.container.components.task.model.entity.TaskEntity; import com.gcc.container.components.task.model.enums.TaskLevel; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.scheduling.support.CronTrigger; import org.springframework.stereotype.Component; - import java.lang.reflect.Constructor; import java.util.List; import java.util.Objects; @@ -19,43 +18,32 @@ import java.util.concurrent.ScheduledFuture; @Slf4j @Component +@AllArgsConstructor public class TaskScheduleImpl implements TaskSchedule { - //正在运行的任务 - private static ConcurrentHashMap runningTasks = new ConcurrentHashMap<>(); - - //线程池任务调度 - private ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); - - //内存中任务对象 - private static ConcurrentHashMap ramTasks = new ConcurrentHashMap<>(); - - //Spring容器池,用于注入Spring的bean - private ApplicationContext context; - + /** + * 正在运行的任务 + */ + private final static ConcurrentHashMap runningTasks = new ConcurrentHashMap<>(); - private TaskRepository taskRepository; + /** + * 线程池任务调度 + */ + private final ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); + /** + * 内存中任务对象 + */ + private final static ConcurrentHashMap ramTasks = new ConcurrentHashMap<>(); - private TaskFactory taskFactory; + private final TaskRepository taskRepository; - @Autowired - public void setTaskRepository(TaskRepository taskRepository) { - this.taskRepository = taskRepository; - } - @Autowired - public void setContext(ApplicationContext context) { - this.context = context; - } + private final TaskFactory taskFactory; - @Autowired - public void setTaskFactory(TaskFactory taskFactory) { - this.taskFactory = taskFactory; - } - @Autowired + private final ApplicationContext context; @Override @@ -170,4 +158,6 @@ public class TaskScheduleImpl implements TaskSchedule { } } } + + } -- Gitee From 468b35a567718073d5317a99b84d08f82164b746 Mon Sep 17 00:00:00 2001 From: GCC1566 <156654540@qq.com> Date: Sat, 6 Sep 2025 14:40:51 +0800 Subject: [PATCH 34/34] =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/web/exception/ControllerExceptionAdvice.java | 2 +- .../com/gcc/container/components/web/model/RequestLog.java | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/rest-component/src/main/java/com/gcc/container/components/web/exception/ControllerExceptionAdvice.java b/rest-component/src/main/java/com/gcc/container/components/web/exception/ControllerExceptionAdvice.java index e280f4a..4f26a00 100644 --- a/rest-component/src/main/java/com/gcc/container/components/web/exception/ControllerExceptionAdvice.java +++ b/rest-component/src/main/java/com/gcc/container/components/web/exception/ControllerExceptionAdvice.java @@ -29,7 +29,7 @@ public class ControllerExceptionAdvice implements ResponseBodyAdvice { @Override public Object beforeBodyWrite(Object data, MethodParameter returnType, MediaType mediaType, Class> aClass, ServerHttpRequest request, ServerHttpResponse response) { //释放swagger接口页面 - if(StrUtil.containsAny(url,"swagger-resources","api-docs")){ + if(StrUtil.containsAny(request.getURI().toString(),"swagger-resources","api-docs")){ return data; } diff --git a/rest-component/src/main/java/com/gcc/container/components/web/model/RequestLog.java b/rest-component/src/main/java/com/gcc/container/components/web/model/RequestLog.java index 3006809..8fb29a7 100644 --- a/rest-component/src/main/java/com/gcc/container/components/web/model/RequestLog.java +++ b/rest-component/src/main/java/com/gcc/container/components/web/model/RequestLog.java @@ -4,10 +4,8 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.URLUtil; import lombok.Data; import javax.servlet.http.HttpServletRequest; -import java.io.Serializable; - @Data -public class RequestLog implements Serializable { +public class RequestLog { private String uri; -- Gitee