浏览代码

版本分支提交

liukaixiong 5 年之前
父节点
当前提交
80a3b56ac1
共有 50 个文件被更改,包括 805 次插入292 次删除
  1. 0 16
      elab-core/src/main/java/com/elab/core/async/CatExecutorService.java
  2. 0 4
      elab-core/src/main/java/com/elab/core/async/TaskEnums.java
  3. 0 4
      elab-core/src/main/java/com/elab/core/async/consumer/RealTimeConsumer.java
  4. 6 2
      elab-core/src/main/java/com/elab/core/async/consumer/SchedulingConsumer.java
  5. 0 58
      elab-core/src/main/java/com/elab/core/async/pruducer/AbstractTaskProducer.java
  6. 6 3
      elab-core/src/main/java/com/elab/core/async/pruducer/ITaskProducer.java
  7. 136 0
      elab-core/src/main/java/com/elab/core/async/pruducer/TaskProducer.java
  8. 6 5
      elab-core/src/main/java/com/elab/core/async/store/TaskExecutorQueue.java
  9. 34 3
      elab-core/src/test/java/com/elab/core/async/pruducer/TaskProducerTest.java
  10. 4 2
      elab-db/src/main/java/com/elab/core/dao/params/NamedParameterUtils2.java
  11. 4 4
      elab-kafka/pom.xml
  12. 5 10
      elab-kafka/src/main/java/com/elab/core/kafka/config/KafkaConsumerConfig.java
  13. 22 3
      elab-kafka/src/main/java/com/elab/core/kafka/consumer/KafkaMsgListener.java
  14. 4 4
      elab-kafka/src/main/java/com/elab/core/kafka/monitor/TopicMonitorRule.java
  15. 2 1
      elab-kafka/src/test/java/com/elab/core/kafka/consumer/AbstractKafkaConsumerTest.java
  16. 1 1
      elab-kafka/src/test/java/com/elab/core/kafka/consumer/ConsumerListener.java
  17. 5 5
      elab-kafka/src/test/resources/application.yml
  18. 36 32
      elab-log/pom.xml
  19. 8 4
      elab-log/src/main/java/com/elab/log/asepct/CatAspect.java
  20. 17 13
      elab-log/src/main/java/com/elab/log/ext/CatRealTaskExecutor.java
  21. 5 2
      elab-log/src/main/java/com/elab/log/ext/CatTaskProducer.java
  22. 1 0
      elab-log/src/main/java/com/elab/log/utils/CatCrossProcess.java
  23. 3 3
      elab-log/src/test/java/com/elab/log/ext/CatTaskProducerTest.java
  24. 24 0
      elab-mongodb/src/test/java/com/elab/test/mongodb/MongodbTest.java
  25. 30 0
      elab-mongodb/src/test/java/com/elab/test/mongodb/ext/JsonObjectDb.java
  26. 7 3
      elab-mq/src/main/java/com/elab/mq/listener/AbstractMessageListener.java
  27. 7 3
      elab-mq/src/main/java/com/elab/mq/msg/impl/MsgProducerImpl.java
  28. 17 1
      elab-redis/README.md
  29. 0 6
      elab-redis/pom.xml
  30. 13 9
      elab-redis/src/main/java/com/elab/redis/config/CacheAutoConfiguration.java
  31. 1 1
      elab-redis/src/main/java/com/elab/redis/interceptor/impl/CacheLoopProcessImpl.java
  32. 8 0
      elab-redis/src/test/java/com/elab/redis/cache/CacheTest.java
  33. 3 0
      elab-redis/src/test/java/com/elab/redis/service/IDemoService.java
  34. 10 0
      elab-redis/src/test/java/com/elab/redis/service/impl/DemoServiceImpl.java
  35. 0 1
      elab-redis/src/test/resources/application.yml
  36. 61 12
      elab-spring/README.md
  37. 6 0
      elab-spring/pom.xml
  38. 25 0
      elab-spring/src/main/java/com/elab/spring/anno/EnableElabSpring.java
  39. 2 4
      elab-spring/src/main/java/com/elab/spring/callback/impl/DefaultRestFallBack.java
  40. 56 53
      elab-spring/src/main/java/com/elab/spring/config/ThreadConfiguration.java
  41. 3 15
      elab-spring/src/main/java/com/elab/spring/config/prop/ThreadProperties.java
  42. 1 0
      elab-spring/src/main/java/com/elab/spring/exception/CommonException.java
  43. 1 1
      elab-spring/src/main/java/com/elab/spring/utils/RestTemplateUtils.java
  44. 45 0
      elab-spring/src/main/java/com/elab/spring/utils/ThreadProcessUtils.java
  45. 47 0
      elab-spring/src/test/java/com/elab/spring/utils/ThreadProcessUtilsTest.java
  46. 1 0
      elab-spring/src/test/resources/META-INF/app.properties
  47. 112 0
      elab-spring/src/test/resources/META-INF/plexus/components-cat-client.xml
  48. 5 1
      elab-spring/src/test/resources/application.yml
  49. 13 3
      elab-spring/src/test/resources/logback.xml
  50. 2 0
      pom.xml

+ 0 - 16
elab-core/src/main/java/com/elab/core/async/CatExecutorService.java

@@ -1,16 +0,0 @@
-package com.elab.core.async;
-
-/**
- * Cat消息执行线程服务
- *
- * @author : liukx
- * @time : 2020/8/7 - 16:52
- */
-
-class CatExecutorService {
-
-
-    public static void main(String[] args) {
-
-    }
-}

+ 0 - 4
elab-core/src/main/java/com/elab/core/async/TaskEnums.java

@@ -1,10 +1,6 @@
 package com.elab.core.async;
 
 public enum TaskEnums {
-
     RealTime,
     Scheduling
-
-
-
 }

+ 0 - 4
elab-core/src/main/java/com/elab/core/async/consumer/RealTimeConsumer.java

@@ -7,8 +7,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.Queue;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 
 /**
  * 实时任务消费
@@ -24,8 +22,6 @@ public class RealTimeConsumer implements Runnable {
 
     private TaskStoreProcess taskStoreProcess = new TaskProcessAdaptor();
 
-    private ExecutorService executor = Executors.newFixedThreadPool(5);
-
     public RealTimeConsumer(Queue<TaskExecutorDecoration> taskQueue) {
         this.taskQueue = taskQueue;
     }

+ 6 - 2
elab-core/src/main/java/com/elab/core/async/consumer/SchedulingConsumer.java

@@ -5,6 +5,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.List;
+import java.util.concurrent.CompletableFuture;
 
 /**
  * 调度消费者
@@ -19,6 +20,8 @@ public class SchedulingConsumer implements Runnable {
      * 调度任务
      */
     private List<SchedulingTaskExecutor> taskExecutors;
+
+
     /**
      * 间隔时间/秒
      */
@@ -34,9 +37,10 @@ public class SchedulingConsumer implements Runnable {
         while (true) {
             try {
                 taskExecutors.forEach((taskExecutor) -> {
-                    taskExecutor.process();
+                    CompletableFuture.runAsync(() -> {
+                        taskExecutor.process();
+                    });
                 });
-                logger.info("开始调度 ----------");
             } catch (Exception e) {
                 logger.error("定时调度异常", e);
             } finally {

+ 0 - 58
elab-core/src/main/java/com/elab/core/async/pruducer/AbstractTaskProducer.java

@@ -1,58 +0,0 @@
-package com.elab.core.async.pruducer;
-
-import com.elab.core.async.RealTaskExecutor;
-import com.elab.core.async.SchedulingTaskExecutor;
-import com.elab.core.async.TaskStoreProcess;
-import com.elab.core.async.model.TaskStoreData;
-import com.elab.core.async.store.TaskExecutorDecoration;
-import com.elab.core.async.store.TaskExecutorQueue;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * 实时生产者
- *
- * @author : liukx
- * @time : 2020/8/6 - 11:17
- */
-public class AbstractTaskProducer implements ITaskProducer {
-
-    private Logger logger = LoggerFactory.getLogger(AbstractTaskProducer.class);
-
-    private TaskExecutorQueue taskExecutorQueue;
-
-    private TaskStoreProcess handler;
-
-    public AbstractTaskProducer(TaskExecutorQueue taskExecutorQueue) {
-        this.taskExecutorQueue = taskExecutorQueue;
-    }
-
-    public void setHandler(TaskStoreProcess handler) {
-        this.handler = handler;
-    }
-
-    @Override
-    public void sendRealTimeQueue(RealTaskExecutor taskExecutor) {
-        sendRealTimeQueue(taskExecutor, null);
-    }
-
-    @Override
-    public void sendRealTimeQueue(RealTaskExecutor taskExecutor, TaskStoreData taskStoreData) {
-        if (taskStoreData != null && taskStoreData.isSave()) {
-            this.handler.add(taskStoreData);
-        }
-        TaskExecutorDecoration taskExecutorDecoration = new TaskExecutorDecoration(taskStoreData, taskExecutor);
-        boolean isConsumer = this.taskExecutorQueue.getRealTimeQueue().add(taskExecutorDecoration);
-
-        if (isConsumer) {
-            logger.debug("加入异步消费队列");
-        } else {
-
-        }
-    }
-
-    @Override
-    public void sendSchedulingList(SchedulingTaskExecutor schedulingTaskExecutor) {
-        this.taskExecutorQueue.getSchedulingList().add(schedulingTaskExecutor);
-    }
-}

+ 6 - 3
elab-core/src/main/java/com/elab/core/async/pruducer/ITaskProducer.java

@@ -4,6 +4,10 @@ import com.elab.core.async.RealTaskExecutor;
 import com.elab.core.async.SchedulingTaskExecutor;
 import com.elab.core.async.model.TaskStoreData;
 
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+
 /**
  * 消息生产者
  *
@@ -12,7 +16,7 @@ import com.elab.core.async.model.TaskStoreData;
  */
 public interface ITaskProducer {
     /**
-     * 添加实时消息
+     * 添加异步消息
      *
      * @param taskExecutor
      */
@@ -26,7 +30,6 @@ public interface ITaskProducer {
      */
     public void sendRealTimeQueue(RealTaskExecutor taskExecutor, TaskStoreData taskStoreData);
 
-
     /**
      * 发送异步调度消息
      *
@@ -34,5 +37,5 @@ public interface ITaskProducer {
      */
     public void sendSchedulingList(SchedulingTaskExecutor schedulingTaskExecutor);
 
-
+    public Map<String, Object> reduce(List<?> calculateList, Function<List<?>, Map<String, Object>> function);
 }

+ 136 - 0
elab-core/src/main/java/com/elab/core/async/pruducer/TaskProducer.java

@@ -0,0 +1,136 @@
+package com.elab.core.async.pruducer;
+
+import com.alibaba.fastjson.JSON;
+import com.elab.core.async.RealTaskExecutor;
+import com.elab.core.async.SchedulingTaskExecutor;
+import com.elab.core.async.TaskStoreProcess;
+import com.elab.core.async.model.TaskStoreData;
+import com.elab.core.async.store.TaskExecutorDecoration;
+import com.elab.core.async.store.TaskExecutorQueue;
+import com.google.common.collect.Lists;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.*;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Function;
+
+/**
+ * 实时生产者
+ *
+ * @author : liukx
+ * @time : 2020/8/6 - 11:17
+ */
+public class TaskProducer implements ITaskProducer {
+
+    private Logger logger = LoggerFactory.getLogger(TaskProducer.class);
+
+    private TaskExecutorQueue taskExecutorQueue;
+
+    private TaskStoreProcess handler;
+
+    public TaskProducer(TaskExecutorQueue taskExecutorQueue) {
+        this.taskExecutorQueue = taskExecutorQueue;
+    }
+
+    public void setHandler(TaskStoreProcess handler) {
+        this.handler = handler;
+    }
+
+    @Override
+    public void sendRealTimeQueue(RealTaskExecutor taskExecutor) {
+        sendRealTimeQueue(taskExecutor, null);
+    }
+
+    @Override
+    public void sendRealTimeQueue(RealTaskExecutor taskExecutor, TaskStoreData taskStoreData) {
+        if (taskStoreData != null && taskStoreData.isSave()) {
+            handAdd(taskStoreData);
+        }
+        TaskExecutorDecoration taskExecutorDecoration = new TaskExecutorDecoration(taskStoreData, taskExecutor);
+        boolean isConsumer = this.taskExecutorQueue.getRealTimeQueue().offer(taskExecutorDecoration);
+        if (!isConsumer) {
+            logger.info("队列满了!");
+        }
+    }
+
+    private void handAdd(TaskStoreData taskStoreData) {
+        if (this.handler != null) {
+            this.handler.add(taskStoreData);
+        }
+    }
+
+    public ThreadPoolExecutor getExecutor() {
+        return new ThreadPoolExecutor(5, 5,
+                0L, TimeUnit.MILLISECONDS,
+                new ArrayBlockingQueue<>(20));
+    }
+
+
+    @Override
+    public Map<String, Object> reduce(List<?> calculateList, Function<List<?>, Map<String, Object>> function) {
+        ThreadPoolExecutor executor = getExecutor();
+        try {
+            int size = calculateList.size();
+            if (size <= 5) {
+                CompletableFuture<Map<String, Object>> mapCompletableFuture = CompletableFuture.supplyAsync(() -> {
+                    return function.apply(calculateList);
+                }, executor);
+                return mapCompletableFuture.get();
+            } else {
+                Map<String, Object> dataMap = new HashMap<>();
+                int batchCount = size / 5;
+
+                if (size % 5 != 0) {
+                    batchCount++;
+                }
+
+                List<? extends List<?>> partitionList = Lists.partition(calculateList, 5);
+//                CompletableFuture<Map<String, Object>>[] listFuture = new CompletableFuture[batchCount];
+                List<CompletableFuture<Map<String, Object>>> list = new ArrayList<>();
+                CompletableFuture<List<CompletableFuture<Map<String, Object>>>> listCompletableFuture = CompletableFuture.completedFuture(list);
+                for (int i = 0; i < batchCount; i++) {
+                    int partitionIndex = i;
+                    list.add(CompletableFuture.supplyAsync(() -> {
+                        Map<String, Object> apply = function.apply(partitionList.get(partitionIndex));
+                        return apply;
+                    }, executor));
+                }
+//                CompletableFuture<Void> completableFuture = CompletableFuture.allOf(listFuture);
+//                completableFuture.get();
+
+                for (int i = 0; i < list.size(); i++) {
+                    CompletableFuture<Map<String, Object>> mapCompletableFuture = list.get(i);
+                    Map<String, Object> stringObjectMap = mapCompletableFuture.get();
+                    System.out.println("-->" + JSON.toJSONString(stringObjectMap));
+                    stringObjectMap.forEach((K, V) -> {
+                        if (dataMap.get(K) == null) {
+                            dataMap.put(K, V);
+                        } else {
+                            if (V instanceof List) {
+                                List mapList = (List) dataMap.get(K);
+                                mapList.addAll((Collection) V);
+                                dataMap.put(K, mapList);
+                            } else {
+                                dataMap.put(K, V);
+                            }
+                        }
+                    });
+                }
+                return dataMap;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+    @Override
+    public void sendSchedulingList(SchedulingTaskExecutor schedulingTaskExecutor) {
+        this.taskExecutorQueue.getSchedulingList().add(schedulingTaskExecutor);
+    }
+}

+ 6 - 5
elab-core/src/main/java/com/elab/core/async/store/TaskExecutorQueue.java

@@ -15,15 +15,16 @@ import java.util.concurrent.ArrayBlockingQueue;
  */
 public class TaskExecutorQueue {
 
-
-
     private Queue<TaskExecutorDecoration> realTimeQueue;
 
     private List<SchedulingTaskExecutor> schedulingList = new ArrayList<>();
 
-//    public TaskExecutorQueue(Integer threadCore, Integer realQueueSize) {
-//        this.realTimeQueue = new ArrayBlockingQueue<TaskExecutorDecoration>(realQueueSize);
-//    }
+    private Integer queueSize = 100;
+
+    public TaskExecutorQueue(Integer queueSize) {
+        this.queueSize = queueSize;
+        this.realTimeQueue = new ArrayBlockingQueue<>(this.queueSize);
+    }
 
     public void setRealTimeQueue(Queue<TaskExecutorDecoration> realTimeQueue) {
         this.realTimeQueue = realTimeQueue;

+ 34 - 3
elab-core/src/test/java/com/elab/core/async/pruducer/TaskProducerTest.java

@@ -1,5 +1,6 @@
 package com.elab.core.async.pruducer;
 
+import com.alibaba.fastjson.JSON;
 import com.elab.core.async.consumer.TaskConsumer;
 import com.elab.core.async.store.TaskExecutorQueue;
 import org.junit.Before;
@@ -8,19 +9,20 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
+import java.util.*;
 
 public class TaskProducerTest {
     private Logger logger = LoggerFactory.getLogger(getClass());
 
-    private AbstractTaskProducer producer;
+    private TaskProducer producer;
 
     @Before
     public void init() {
-        TaskExecutorQueue queue = new TaskExecutorQueue();
+        TaskExecutorQueue queue = new TaskExecutorQueue(50);
         TaskConsumer taskConsumer = new TaskConsumer(queue);
         taskConsumer.startRealTimeConsumer();
         taskConsumer.startSchedulingConsumer(5);
-        producer = new AbstractTaskProducer(queue);
+        producer = new TaskProducer(queue);
     }
 
     @Test
@@ -60,4 +62,33 @@ public class TaskProducerTest {
         }
         System.in.read();
     }
+
+    @Test
+    public void testReduce() throws Exception {
+        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
+
+        Map<String, Object> reduce = producer.reduce(list, (intList) -> {
+            System.out.println("====>>>>开始处理" + JSON.toJSONString(intList));
+            Map<String, Object> map = new HashMap<>();
+            List<Integer> aList = new ArrayList<>();
+            List<Integer> bList = new ArrayList<>();
+
+            for (int i = 0; i < intList.size(); i++) {
+                Integer index = list.get(i);
+                if (index % 2 == 0) {
+                    aList.add(index);
+                } else {
+                    bList.add(index);
+                }
+            }
+
+            map.put("A", aList);
+            map.put("B", bList);
+            return map;
+        });
+        System.out.println("map : " + JSON.toJSONString(reduce));
+        System.in.read();
+
+    }
+
 }

+ 4 - 2
elab-db/src/main/java/com/elab/core/dao/params/NamedParameterUtils2.java

@@ -20,6 +20,8 @@ import com.elab.core.dao.model.*;
 import com.elab.core.sql.config.SqlCommandType;
 import com.elab.core.utils.ObjectUtils;
 import com.elab.core.utils.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.dao.InvalidDataAccessApiUsageException;
 import org.springframework.jdbc.core.SqlParameter;
 import org.springframework.jdbc.core.SqlParameterValue;
@@ -39,7 +41,7 @@ import java.util.*;
  * @since 2.0
  */
 public abstract class NamedParameterUtils2 {
-
+    private Logger logger = LoggerFactory.getLogger(getClass());
     /**
      * Logger available to subclasses
      */
@@ -364,11 +366,11 @@ public abstract class NamedParameterUtils2 {
                 Object value = null;
                 try {
                     value = mapSqlParameterSource.getValue(table.trim());
+                    sql = sql.replace("$" + table.trim(), value.toString());
                 } catch (Exception e) {
                     System.err.println(" !!!!!!!!动态参数为必填项 : $" + table.trim() + " 必须为它赋值 .!!!!!!!!!!!!!");
                     e.printStackTrace();
                 }
-                sql = sql.replace("$" + table.trim(), value.toString());
             }
         }
         return sql;

+ 4 - 4
elab-kafka/pom.xml

@@ -13,10 +13,10 @@
 
     <dependencies>
 
-        <dependency>
-            <groupId>com.jay.monitor.data</groupId>
-            <artifactId>jay-monitor-data-client</artifactId>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.jay.monitor.data</groupId>-->
+<!--            <artifactId>jay-monitor-data-client</artifactId>-->
+<!--        </dependency>-->
 
         <dependency>
             <groupId>org.springframework.kafka</groupId>

+ 5 - 10
elab-kafka/src/main/java/com/elab/core/kafka/config/KafkaConsumerConfig.java

@@ -4,8 +4,7 @@ import com.elab.core.kafka.consumer.AbstractKafkaConsumer;
 import com.elab.core.kafka.consumer.KafkaMsgListener;
 import com.elab.core.kafka.monitor.TopicMonitorRule;
 import com.elab.core.kafka.sender.KafkaProducerImpl;
-import com.jay.monitor.data.client.ext.MqMonitorRuleCallback;
-import com.jay.monitor.data.client.ext.kafka.consumer.KafkaMonitorConsumerListener;
+import com.jay.monitor.data.client.ext.MonitorRuleFactory;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.kafka.clients.CommonClientConfigs;
 import org.apache.kafka.clients.consumer.ConsumerConfig;
@@ -17,7 +16,6 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.kafka.KafkaProperties;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.Bean;
@@ -47,8 +45,6 @@ public class KafkaConsumerConfig {
     @Value(value = "${java.security.auth.login.config:}")
     private String authConfig;
 
-    @Autowired(required = false)
-    private List<MqMonitorRuleCallback> monitorRuleCallbacks;
 
     @Autowired(required = false)
     private ProducerListener<String, String> producerListeners;
@@ -67,16 +63,16 @@ public class KafkaConsumerConfig {
 
     @Bean
     @ConditionalOnBean(value = {AbstractKafkaConsumer.class})
-    public KafkaMessageListenerContainer<String, String> kafkaMessageListenerContainer(KafkaProperties kafkaProperties, List<AbstractKafkaConsumer> kafkaConsumer) {
+    public KafkaMessageListenerContainer<String, String> kafkaMessageListenerContainer(KafkaProperties kafkaProperties, List<AbstractKafkaConsumer> kafkaConsumer,@Autowired(required = false) MonitorRuleFactory monitorRuleFactory) {
         List<String> topicList = kafkaConsumer.stream().map(AbstractKafkaConsumer::subscribeTopic).collect(Collectors.toList());
         logger.info("关注kafka的topic:" + topicList);
         ContainerProperties containerProps = new ContainerProperties(topicList.toArray(new String[topicList.size()]));
 
-        KafkaMsgListener kafkaMsgListener = new KafkaMsgListener(kafkaConsumer);
+        KafkaMsgListener kafkaMsgListener = new KafkaMsgListener(kafkaConsumer,monitorRuleFactory);
         // 包装成监控
-        KafkaMonitorConsumerListener kafkaMonitorConsumerListener = new KafkaMonitorConsumerListener(kafkaMsgListener, monitorRuleCallbacks);
+        //  KafkaMonitorConsumerListener kafkaMonitorConsumerListener = new KafkaMonitorConsumerListener(kafkaMsgListener, monitorRuleFactory);
 
-        containerProps.setMessageListener(kafkaMonitorConsumerListener);
+        containerProps.setMessageListener(kafkaMsgListener);
         containerProps.setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE);
         containerProps.setSyncCommits(true);
         DefaultKafkaConsumerFactory<String, String> cf =
@@ -87,7 +83,6 @@ public class KafkaConsumerConfig {
     }
 
     @Bean
-    @ConditionalOnMissingBean(value = {TopicMonitorRule.class})
     public TopicMonitorRule topicMonitorRule() {
         return new TopicMonitorRule();
     }

+ 22 - 3
elab-kafka/src/main/java/com/elab/core/kafka/consumer/KafkaMsgListener.java

@@ -2,6 +2,10 @@ package com.elab.core.kafka.consumer;
 
 import com.alibaba.fastjson.JSON;
 import com.elab.log.utils.CatCrossProcess;
+import com.jay.monitor.data.client.MonitorSendProducer;
+import com.jay.monitor.data.client.ext.MonitorRuleFactory;
+import com.jay.monitor.data.client.utils.MonitorUtils;
+import com.jay.monitor.data.core.model.serializable.MQDataDTO;
 import org.apache.kafka.clients.consumer.ConsumerRecord;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -20,12 +24,16 @@ import java.util.Map;
  * @Date 2020/10/27 19:14
  */
 public class KafkaMsgListener implements AcknowledgingMessageListener<String, String>, InitializingBean {
+
     private Logger logger = LoggerFactory.getLogger(getClass());
     private List<AbstractKafkaConsumer> messageListeners;
 
-    public KafkaMsgListener(List<AbstractKafkaConsumer> messageListeners) {
-        Assert.notNull(messageListeners, "请实现一个AbstractKafkaConsumer的子类,并注册到ioc容器中");
-        this.messageListeners = messageListeners;
+    private MonitorRuleFactory monitorRuleFactory;
+
+    public KafkaMsgListener(List<AbstractKafkaConsumer> kafkaConsumer, MonitorRuleFactory monitorRuleFactory) {
+        Assert.notNull(kafkaConsumer, "请实现一个AbstractKafkaConsumer的子类,并注册到ioc容器中");
+        this.messageListeners = kafkaConsumer;
+        this.monitorRuleFactory = monitorRuleFactory;
     }
 
     @Override
@@ -39,13 +47,24 @@ public class KafkaMsgListener implements AcknowledgingMessageListener<String, St
                         listener.onMessage(data, acknowledgment);
                     }
                 });
+                if (acknowledgment != null) {
+                    sendMonitorData(data, 1);
+                } else {
+                    sendMonitorData(data, -1);
+                }
             } catch (Exception e) {
+                logger.error("kafka消费失败", e);
+                sendMonitorData(data, -1);
                 throw e;
             }
             return acknowledgment;
         });
     }
 
+    private void sendMonitorData(ConsumerRecord<String, String> data, Integer status) {
+        MQDataDTO mqDataDTO = MonitorUtils.getConsumerMqDataDTO(this.monitorRuleFactory.getMqRuleMap(), data.topic(), data.key(), data.partition(), data.offset(), data.value(), status);
+        MonitorSendProducer.sendMsg(mqDataDTO);
+    }
 
     @Override
     public void afterPropertiesSet() throws Exception {

+ 4 - 4
elab-kafka/src/main/java/com/elab/core/kafka/monitor/TopicMonitorRule.java

@@ -1,16 +1,15 @@
 package com.elab.core.kafka.monitor;
 
 import com.alibaba.fastjson.JSON;
+import com.dianping.cat.Cat;
 import com.elab.log.model.CatCrossIdModel;
 import com.jay.monitor.data.client.ext.MqMonitorRuleCallback;
 import com.jay.monitor.data.core.model.serializable.MQDataDTO;
-import org.springframework.stereotype.Component;
 
 import java.util.HashMap;
 import java.util.Map;
 import java.util.function.BiConsumer;
 
-@Component
 public class TopicMonitorRule extends MqMonitorRuleCallback {
 
     @Override
@@ -21,8 +20,9 @@ public class TopicMonitorRule extends MqMonitorRuleCallback {
             CatCrossIdModel catCrossIdModel = JSON.parseObject(value, CatCrossIdModel.class);
             mqData.setRootLogId(catCrossIdModel.get_catRootMessageId());
             mqData.setParentLogId(catCrossIdModel.get_catParentMessageId());
-            // 这里不用get_catChildMessageId的原因是因为生产者是不确定下游的消费者是谁的。所以还是先把子id在监控构建中传递上级,也就是自己
-            mqData.setLogId(catCrossIdModel.get_catParentMessageId());
+            // 这里不用get_catChildMessageId的原因是因为生产者是不确定下游的消费者是谁的。
+            // 这里还是用当前线程产生的LogId。这个id非常重要。
+            mqData.setLogId(Cat.getCurrentMessageId());
         });
 
         return map;

+ 2 - 1
elab-kafka/src/test/java/com/elab/core/kafka/consumer/AbstractKafkaConsumerTest.java

@@ -4,6 +4,7 @@ package com.elab.core.kafka.consumer;
 import com.elab.core.kafka.config.KafkaConsumerConfig;
 import com.elab.core.kafka.monitor.TestTopicMonitorRule;
 import com.jay.monitor.data.client.config.ClientMonitorAutoConfiguration;
+import com.jay.monitor.data.client.config.KafkaMonitorAutoConfiguration;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.slf4j.Logger;
@@ -18,7 +19,7 @@ import org.springframework.test.context.junit4.SpringRunner;
  * @Date 2020/10/27 16:21
  */
 @RunWith(SpringRunner.class)
-@SpringBootTest(classes = { TestTopicMonitorRule.class, KafkaConsumerConfig.class, ConsumerListener.class, ClientMonitorAutoConfiguration.class})
+@SpringBootTest(classes = {TestTopicMonitorRule.class, KafkaConsumerConfig.class, ConsumerListener.class, KafkaMonitorAutoConfiguration.class, ClientMonitorAutoConfiguration.class})
 public class AbstractKafkaConsumerTest {
 
     private Logger logger = LoggerFactory.getLogger(getClass());

+ 1 - 1
elab-kafka/src/test/java/com/elab/core/kafka/consumer/ConsumerListener.java

@@ -19,7 +19,7 @@ public class ConsumerListener extends AbstractKafkaConsumer {
 
     @Override
     public String subscribeTopic() {
-        return "uat-mysql-dts";
+        return "test-mysql-dts";
     }
 
     @Override

+ 5 - 5
elab-kafka/src/test/resources/application.yml

@@ -10,9 +10,9 @@ spring:
       value-serializer: org.apache.kafka.common.serialization.StringSerializer
     #      client-id: kafka-server-1
     template:
-      default-topic: uat-mysql-dts
+      default-topic: test-mysql-dts
     consumer:
-      group-id: test-market-db
+      group-id: elab_laicy
       max-poll-records: 30
       fetch-min-size: 32000
       key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
@@ -21,9 +21,9 @@ spring:
     ssl:
       truststore-password: KafkaOnsClient
       truststore-location: kafka.client.truststore.jks
-#  monitor-data:
-#    host: 127.0.0.1
-#    port: 9420
+  monitor-data:
+    host: 127.0.0.1
+    port: 9420
 java:
   security:
     auth:

+ 36 - 32
elab-log/pom.xml

@@ -19,6 +19,10 @@
             <artifactId>elab-core</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>com.jay.monitor.data</groupId>
+            <artifactId>jay-monitor-data-client</artifactId>
+        </dependency>
         <dependency>
             <groupId>com.elab.core</groupId>
             <artifactId>elab-annotation</artifactId>
@@ -41,9 +45,9 @@
         </dependency>
 
         <dependency>
-        <groupId>org.slf4j</groupId>
-        <artifactId>slf4j-api</artifactId>
-    </dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
         <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
         <dependency>
             <groupId>org.slf4j</groupId>
@@ -51,22 +55,22 @@
             <scope>provided</scope>
         </dependency>
         <!--<dependency>-->
-            <!--<groupId>org.springframework.cloud</groupId>-->
-            <!--<artifactId>spring-cloud-redisson-feign</artifactId>-->
-            <!--<version>1.4.4.RELEASE</version>-->
-            <!--<scope>provided</scope>-->
+        <!--<groupId>org.springframework.cloud</groupId>-->
+        <!--<artifactId>spring-cloud-redisson-feign</artifactId>-->
+        <!--<version>1.4.4.RELEASE</version>-->
+        <!--<scope>provided</scope>-->
         <!--</dependency>-->
         <!--<dependency>-->
-            <!--<groupId>com.netflix.hystrix</groupId>-->
-            <!--<artifactId>hystrix-core</artifactId>-->
-            <!--<version>1.5.12</version>-->
-            <!--<scope>provided</scope>-->
+        <!--<groupId>com.netflix.hystrix</groupId>-->
+        <!--<artifactId>hystrix-core</artifactId>-->
+        <!--<version>1.5.12</version>-->
+        <!--<scope>provided</scope>-->
         <!--</dependency>-->
         <!--<dependency>-->
-            <!--<groupId>com.elab.cloud</groupId>-->
-            <!--<artifactId>elab-cloud-commons</artifactId>-->
-            <!--<version>1.0.0</version>-->
-            <!--<scope>provided</scope>-->
+        <!--<groupId>com.elab.cloud</groupId>-->
+        <!--<artifactId>elab-cloud-commons</artifactId>-->
+        <!--<version>1.0.0</version>-->
+        <!--<scope>provided</scope>-->
         <!--</dependency>-->
         <dependency>
             <groupId>junit</groupId>
@@ -92,23 +96,23 @@
 
             <!-- 打包javadoc插件 -->
             <!--<plugin>-->
-                <!--<groupId>org.apache.maven.plugins</groupId>-->
-                <!--<artifactId>maven-javadoc-plugin</artifactId>-->
-                <!--&lt;!&ndash;<version>2.9</version>&ndash;&gt;-->
-                <!--<executions>-->
-                    <!--<execution>-->
-                        <!--<id>attach-javadocs</id>-->
-                        <!--<goals>-->
-                            <!--<goal>jar</goal>-->
-                        <!--</goals>-->
-                        <!--<doc>-->
-                            <!--<additionalparam>-Xdoclint:none</additionalparam>-->
-                            <!--<charset>UTF-8</charset>-->
-                            <!--<encoding>UTF-8</encoding>-->
-                            <!--<docencoding>UTF-8</docencoding>-->
-                        <!--</doc>-->
-                    <!--</execution>-->
-                <!--</executions>-->
+            <!--<groupId>org.apache.maven.plugins</groupId>-->
+            <!--<artifactId>maven-javadoc-plugin</artifactId>-->
+            <!--&lt;!&ndash;<version>2.9</version>&ndash;&gt;-->
+            <!--<executions>-->
+            <!--<execution>-->
+            <!--<id>attach-javadocs</id>-->
+            <!--<goals>-->
+            <!--<goal>jar</goal>-->
+            <!--</goals>-->
+            <!--<doc>-->
+            <!--<additionalparam>-Xdoclint:none</additionalparam>-->
+            <!--<charset>UTF-8</charset>-->
+            <!--<encoding>UTF-8</encoding>-->
+            <!--<docencoding>UTF-8</docencoding>-->
+            <!--</doc>-->
+            <!--</execution>-->
+            <!--</executions>-->
             <!--</plugin>-->
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>

+ 8 - 4
elab-log/src/main/java/com/elab/log/asepct/CatAspect.java

@@ -67,8 +67,7 @@ public class CatAspect {
             proceed = pjp.proceed();
             t.setStatus(Transaction.SUCCESS);
         } catch (Throwable e) {
-            exceptionProcess(e, t);
-            logger.error("[" + value + "]", e);
+            exceptionProcess(e, t, value);
         } finally {
             if (proceed instanceof Info) {
                 Info info = (Info) proceed;
@@ -91,8 +90,9 @@ public class CatAspect {
      *
      * @param e
      * @param t
+     * @param value
      */
-    private void exceptionProcess(Throwable e, Transaction t) {
+    private void exceptionProcess(Throwable e, Transaction t, String value) {
         // 属于业务参数异常和系统异常没有关系
         if (e instanceof BusinessException) {
             logger.debug(e.getMessage());
@@ -106,7 +106,11 @@ public class CatAspect {
             logger.debug(e.getMessage());
             throw new CoreException(((CoreException) e).getErrorCode(), e.getMessage());
         }
-
+        if (value != null) {
+            logger.error("[" + value + "]", e);
+        } else {
+            logger.error("[未知作者]", e);
+        }
         throw new RuntimeException(e.getMessage());
     }
 

+ 17 - 13
elab-log/src/main/java/com/elab/log/ext/CatRealTaskExecutor.java

@@ -1,11 +1,13 @@
 package com.elab.log.ext;
 
-import com.dianping.cat.message.Transaction;
 import com.elab.core.async.RealTaskExecutor;
 import com.elab.core.async.TaskEnums;
 import com.elab.core.async.model.TaskStoreData;
-import com.elab.core.async.pruducer.AbstractTaskProducer;
+import com.elab.core.async.pruducer.TaskProducer;
 import com.elab.log.utils.CatCrossProcess;
+import com.jay.monitor.data.client.MonitorSendProducer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.Map;
 
@@ -16,7 +18,7 @@ import java.util.Map;
  * @time : 2020/8/7 - 10:51
  */
 public class CatRealTaskExecutor implements RealTaskExecutor {
-
+    private Logger logger = LoggerFactory.getLogger(getClass());
     private RealTaskExecutor realTaskExecutor;
 
     private TaskStoreData taskStoreData;
@@ -32,19 +34,21 @@ public class CatRealTaskExecutor implements RealTaskExecutor {
     @Override
     public void run() {
         Map<String, String> dataMap = taskStoreData.getDataMap();
-        Transaction t = CatCrossProcess.getCrossTransactionMsg("privateQueue", taskEnums.name(), dataMap);
-        try {
-            realTaskExecutor.run();
-            t.setSuccessStatus();
-        } catch (Exception e) {
-            t.setStatus(e);
-        } finally {
-            t.complete();
-        }
+
+        Boolean invoke = CatCrossProcess.buildRemoteMsg("privateQueue", taskEnums.name(), dataMap, () -> {
+            try {
+                realTaskExecutor.run();
+                MonitorSendProducer.sendMsg(taskStoreData);
+                return true;
+            } catch (Exception e) {
+                logger.error("线程消费失败", e);
+            }
+            return false;
+        });
     }
 
     public static void main(String[] args) {
-        AbstractTaskProducer taskProducer = null;
+        TaskProducer taskProducer = null;
 
     }
 }

+ 5 - 2
elab-log/src/main/java/com/elab/log/ext/CatTaskProducer.java

@@ -3,7 +3,7 @@ package com.elab.log.ext;
 import com.elab.core.async.RealTaskExecutor;
 import com.elab.core.async.TaskEnums;
 import com.elab.core.async.model.TaskStoreData;
-import com.elab.core.async.pruducer.AbstractTaskProducer;
+import com.elab.core.async.pruducer.TaskProducer;
 import com.elab.core.async.store.TaskExecutorQueue;
 import com.elab.log.utils.CatCrossProcess;
 
@@ -15,7 +15,7 @@ import java.util.Map;
  * @author : liukx
  * @time : 2020/8/7 - 11:02
  */
-public class CatTaskProducer extends AbstractTaskProducer {
+public class CatTaskProducer extends TaskProducer {
 
     public CatTaskProducer(TaskExecutorQueue taskExecutorQueue) {
         super(taskExecutorQueue);
@@ -36,6 +36,9 @@ public class CatTaskProducer extends AbstractTaskProducer {
     public void sendRealTimeQueue(RealTaskExecutor taskExecutor, TaskStoreData taskStoreData) {
         //构建消息上下文
         Map<String, String> msgContextMap = CatCrossProcess.getMsgContextMap();
+        if (taskStoreData == null) {
+            taskStoreData = new TaskStoreData();
+        }
         taskStoreData.getDataMap().putAll(msgContextMap);
         // 构建消息串联执行器
         CatRealTaskExecutor catRealTaskExecutor = new CatRealTaskExecutor(TaskEnums.RealTime, taskExecutor,

+ 1 - 0
elab-log/src/main/java/com/elab/log/utils/CatCrossProcess.java

@@ -228,6 +228,7 @@ public class CatCrossProcess {
             Cat.Context context = new CatMsgContext();
             context.addProperty(Cat.Context.ROOT, msgIdMap.get(Cat.Context.ROOT));
             context.addProperty(Cat.Context.PARENT, msgIdMap.get(Cat.Context.PARENT));
+            context.addProperty(Cat.Context.CHILD, Cat.getCurrentMessageId());
             // 这里不需要构建客户端带过来的编号,因为消费者是多个,避免LOG被覆盖的情况。
             Cat.logRemoteCallServer(context);
 

+ 3 - 3
elab-log/src/test/java/com/elab/log/ext/CatTaskProducerTest.java

@@ -2,7 +2,7 @@ package com.elab.log.ext;
 
 
 import com.elab.core.async.consumer.TaskConsumer;
-import com.elab.core.async.pruducer.AbstractTaskProducer;
+import com.elab.core.async.pruducer.TaskProducer;
 import com.elab.core.async.store.TaskExecutorQueue;
 import org.junit.Before;
 import org.junit.Test;
@@ -15,11 +15,11 @@ public class CatTaskProducerTest {
 
     private Logger logger = LoggerFactory.getLogger(getClass());
 
-    private AbstractTaskProducer producer;
+    private TaskProducer producer;
 
     @Before
     public void init() {
-        TaskExecutorQueue queue = new TaskExecutorQueue();
+        TaskExecutorQueue queue = new TaskExecutorQueue(50);
         TaskConsumer taskConsumer = new TaskConsumer(queue);
         taskConsumer.startRealTimeConsumer();
         taskConsumer.startSchedulingConsumer(5);

+ 24 - 0
elab-mongodb/src/test/java/com/elab/test/mongodb/MongodbTest.java

@@ -1,6 +1,8 @@
 package com.elab.test.mongodb;
 
+import com.alibaba.fastjson.JSONObject;
 import com.elab.test.mongodb.entity.User;
+import com.elab.test.mongodb.ext.JsonObjectDb;
 import com.elab.test.mongodb.ext.UserMongoDB;
 import com.mongodb.MongoClient;
 import org.junit.Test;
@@ -46,6 +48,28 @@ public class MongodbTest {
         System.out.println("成功~");
     }
 
+    @Test
+    public void insertJSON() throws UnknownHostException {
+        JsonObjectDb mongoDB = new JsonObjectDb();
+        MongoTemplate mongoTemplate = new MongoTemplate(new SimpleMongoDbFactory(new MongoClient("127.0.0.1", Integer.parseInt("27017")),
+                "test"));
+
+        mongoDB.setMongoTemplate(mongoTemplate);
+
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("aaa", "fffff");
+        jsonObject.put("字段1", "二二二");
+
+        mongoTemplate.insert(jsonObject);
+
+
+//        mongoDB.batchSave(list);
+//        mongoDB.save(user);
+//        mongoDB.save(user1);
+//        mongoDB.save(user2);
+        System.out.println("成功~");
+    }
+
     @Test
     public void update() throws Exception {
         MongoTemplate mongoTemplate = new MongoTemplate(new SimpleMongoDbFactory(new MongoClient("127.0.0.1", Integer.parseInt("27017")),

+ 30 - 0
elab-mongodb/src/test/java/com/elab/test/mongodb/ext/JsonObjectDb.java

@@ -0,0 +1,30 @@
+package com.elab.test.mongodb.ext;
+
+import com.alibaba.fastjson.JSONObject;
+import com.elab.mongodb.BaseMongodb;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+
+/**
+ * @Module TODO
+ * @Description TODO
+ * @Author liukaixiong
+ * @Date 2020/11/18 10:26
+ */
+public class JsonObjectDb extends BaseMongodb<JSONObject> {
+
+    @Autowired
+    private MongoTemplate mongoTemplate;
+    @Override
+    public MongoTemplate getMongoTemplate() {
+        return mongoTemplate;
+    }
+
+    @Override
+    public Class<JSONObject> getEntity() {
+        return JSONObject.class;
+    }
+    public void setMongoTemplate(MongoTemplate mongoTemplate) {
+        this.mongoTemplate = mongoTemplate;
+    }
+}

+ 7 - 3
elab-mq/src/main/java/com/elab/mq/listener/AbstractMessageListener.java

@@ -66,7 +66,6 @@ public abstract class AbstractMessageListener implements MessageListener {
 
         String topic = message.getTopic();
         String tag = message.getTag();
-        ConsumerEntity oldConsumerEntity = new ConsumerEntity();
         ConsumerEntity consumerEntity = new ConsumerEntity();
         consumerEntity.setProducerId(producerId);
         consumerEntity.setTopicId(topic);
@@ -75,7 +74,7 @@ public abstract class AbstractMessageListener implements MessageListener {
         consumerEntity.setMsgId(msgID);
         consumerEntity.setTag(tag);
         consumerEntity.setModuleMethod(getClass().getName());
-        oldConsumerEntity = consumerDao.selectByObject(consumerEntity);
+        ConsumerEntity oldConsumerEntity = consumerDao.selectByObject(consumerEntity);
         if (oldConsumerEntity != null && oldConsumerEntity.getConsumerStatus().equals(1)) {
             logger.warn("消费者验证失败,已经消费成功过一次,不允许重复消费 消费编号 : " + oldConsumerEntity.getId());
             // throw new BusinessException("请不要重复消费,key:" + message);
@@ -92,7 +91,12 @@ public abstract class AbstractMessageListener implements MessageListener {
         } else {
             oldConsumerEntity = new ConsumerEntity();
             oldConsumerEntity.setProducerId(producerId);
-            oldConsumerEntity.setContent(new String(message.getBody()));
+            String content = new String(message.getBody());
+            if (content.length() < 5000) {
+                oldConsumerEntity.setContent(content);
+            } else {
+                oldConsumerEntity.setContent(content.substring(0, 5000));
+            }
             oldConsumerEntity.setHouseId(message.getHouseId());
             oldConsumerEntity.setModuleName(moduleName);
             oldConsumerEntity.setStatus(1);

+ 7 - 3
elab-mq/src/main/java/com/elab/mq/msg/impl/MsgProducerImpl.java

@@ -69,7 +69,13 @@ public class MsgProducerImpl extends ProducerBean implements IMsgProducerFacade
         producerEntity.setProducerStatus(0);
         producerEntity.setGroupId(message.getGroupId());
         producerEntity.setTopicId(message.getTopic());
-        producerEntity.setContent(content);
+        if (content != null) {
+            if (content.length() < 10000) {
+                producerEntity.setContent(content);
+            } else {
+                producerEntity.setContent(content.substring(0, 10000));
+            }
+        }
         producerEntity.setStatus(1);
         producerEntity.setCreated(DateUtils.getCurrentDateTime());
         int id = 0;
@@ -169,6 +175,4 @@ public class MsgProducerImpl extends ProducerBean implements IMsgProducerFacade
     }
 
 
-
-
 }

+ 17 - 1
elab-redis/README.md

@@ -101,4 +101,20 @@ public void testApp() throws Exception {
 
 ```java
 @CacheEvict(cacheNames="books", beforeInvocation=true)
-```
+```
+
+
+## 内置自定义注解
+#### CacheLoopSubmit 
+同一时刻,只能有一个相匹配的key被访问!
+```java
+@CacheLoopSubmit(unionKey = "[0]{text}", cacheName = "demo", timeOut = 10)
+public String submit(SomeObject text) throws Exception {
+    count--;
+    Thread.sleep(500);
+    logger.info(text + " 抢到一个资源 , 资源池  " + count);
+    return text.getText();
+}
+```
+- [0] 代表第0个参数
+- {text} : 代表对象的属性

+ 0 - 6
elab-redis/pom.xml

@@ -34,12 +34,6 @@
             <version>${project.version}</version>
         </dependency>
 
-        <!--<dependency>-->
-            <!--<groupId>cn.hutool</groupId>-->
-            <!--<artifactId>hutool-http</artifactId>-->
-            <!--<version>5.0.7</version>-->
-            <!--<scope>compile</scope>-->
-        <!--</dependency>-->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-autoconfigure-processor</artifactId>

+ 13 - 9
elab-redis/src/main/java/com/elab/redis/config/CacheAutoConfiguration.java

@@ -62,7 +62,7 @@ public class CacheAutoConfiguration {
     @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
     public BeanFactoryCacheAttributeSourceAdvisor transactionAdvisor() {
         BeanFactoryCacheAttributeSourceAdvisor advisor = new BeanFactoryCacheAttributeSourceAdvisor();
-        advisor.setAdvice(cacheInterceptor());
+        advisor.setAdvice(redisCacheInterceptor());
         advisor.setPointcut(cacheAttributeSourcePointcut());
         return advisor;
     }
@@ -79,7 +79,7 @@ public class CacheAutoConfiguration {
 
     @Bean
     @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
-    public CacheInterceptor cacheInterceptor() {
+    public CacheInterceptor redisCacheInterceptor() {
         CacheInterceptor interceptor = new CacheInterceptor();
         return interceptor;
     }
@@ -88,21 +88,25 @@ public class CacheAutoConfiguration {
     public CacheManager cacheManager(RedissonClient redissonClient, ElabRedisProperties elabRedisProperties) {
         // 统一的注解缓存失效配置
         DefaultRedissonSpringCacheManager defaultRedissonSpringCacheManager = new DefaultRedissonSpringCacheManager(redissonClient);
-        // defaultRedissonSpringCacheManager.setCacheConfig(elabRedisProperties.getCacheConfig());
+//         defaultRedissonSpringCacheManager.setCacheConfig(elabRedisProperties.getCacheConfig());
 
         return defaultRedissonSpringCacheManager;
     }
+
 //    @Bean
-//    public CacheManager cacheManager(RedisConnectionFactory connectionFactory, ElabRedisProperties redisProperties) {
+//    public CacheManager cacheManager(RedissonConnectionFactory connectionFactory, ElabRedisProperties redisProperties) {
 //        // 统一的注解缓存失效配置
 //        RedisSerializationContext.SerializationPair<String> keySerializationPair = RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer());
 //        RedisSerializationContext.SerializationPair<Object> valueSerialization = RedisSerializationContext.SerializationPair.fromSerializer(new GenericFastJsonRedisSerializer());
 //        RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig().serializeKeysWith(keySerializationPair)
-//                .serializeValuesWith(valueSerialization).computePrefixWith(cacheName -> redisProperties.getPrefixWith
-//                        () + cacheName)
-//                .entryTtl
-//                        (Duration
-//                                .ofMinutes(redisProperties.getTtl()));
+//                .serializeValuesWith(valueSerialization).computePrefixWith(cacheName -> redisProperties.getPrefixWith() + cacheName)
+//                .entryTtl(Duration.ofMinutes(redisProperties.getTtl()));
 //        return RedisCacheManager.builder(connectionFactory).cacheDefaults(configuration).build();
 //    }
+
+//    @Bean
+//    public CacheManager cacheManager(@Autowired RedissonClient redissonClient){
+//        RedissonSpringCacheManager redissonSpringCacheManager = new DefaultRedissonSpringCacheManager(redissonClient);
+//
+//    }
 }

+ 1 - 1
elab-redis/src/main/java/com/elab/redis/interceptor/impl/CacheLoopProcessImpl.java

@@ -45,7 +45,7 @@ public class CacheLoopProcessImpl implements ICacheProcessService {
         Object[] arguments = invocation.getArguments();
 
         String cacheKey = CacheParseUtil.generateUnionKey(unionKey, arguments);
-        String lockKey =  clazzName + "." + method.getName();
+        String lockKey = clazzName + "." + method.getName();
 
         RSet<Object> lockObject = client.getSet(lockKey);
         RLock lock = lockObject.getLock(cacheKey);

+ 8 - 0
elab-redis/src/test/java/com/elab/redis/cache/CacheTest.java

@@ -3,6 +3,7 @@ package com.elab.redis.cache;
 import com.alibaba.fastjson.JSONObject;
 import com.elab.core.utils.RandomUtils;
 import com.elab.redis.RedisSpringBoot;
+import com.elab.redis.redisson.doc.model.SomeObject;
 import com.elab.redis.service.IDemoService;
 import com.elab.redis.service.impl.DemoServiceImpl;
 import org.junit.Test;
@@ -36,6 +37,13 @@ public class CacheTest extends RedisSpringBoot {
         System.in.read();
     }
 
+    @Test
+    public void testCacheObject() throws Exception {
+        SomeObject someObject = new SomeObject();
+        someObject.setText("asdfasdf");
+        demoService.submit(someObject);
+    }
+
     @Test
     public void testNoCache() {
         demoService.noCache("aaaa");

+ 3 - 0
elab-redis/src/test/java/com/elab/redis/service/IDemoService.java

@@ -1,6 +1,7 @@
 package com.elab.redis.service;
 
 import com.alibaba.fastjson.JSONObject;
+import com.elab.redis.redisson.doc.model.SomeObject;
 
 /**
  * @author : liukx
@@ -11,6 +12,8 @@ public interface IDemoService {
 
     public String submit(String text) throws Exception;
 
+    public String submit(SomeObject text) throws Exception;
+
     public String springCache(String text) throws Exception;
 
     public String springCacheObject(JSONObject jsonObject) throws Exception;

+ 10 - 0
elab-redis/src/test/java/com/elab/redis/service/impl/DemoServiceImpl.java

@@ -3,6 +3,7 @@ package com.elab.redis.service.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.elab.core.utils.RandomUtils;
 import com.elab.redis.annotation.CacheLoopSubmit;
+import com.elab.redis.redisson.doc.model.SomeObject;
 import com.elab.redis.service.IDemoService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -34,6 +35,15 @@ public class DemoServiceImpl implements IDemoService {
         return "lkx";
     }
 
+    @Override
+    @CacheLoopSubmit(unionKey = "[0]{text}", cacheName = "demo", timeOut = 10)
+    public String submit(SomeObject text) throws Exception {
+        count--;
+        Thread.sleep(500);
+        logger.info(text + " 抢到一个资源 , 资源池  " + count);
+        return text.getText();
+    }
+
     @Cacheable(cacheNames = "DemoServiceImpl", key = "':springCache'  +':'+#a0")
     public String springCache(String text) {
         String s = "xiong_" + RandomUtils.randomString(2);

+ 0 - 1
elab-redis/src/test/resources/application.yml

@@ -5,7 +5,6 @@ spring:
     password: xcGm4kTks6
     port: 6379
     timeout: 2s
-    redismax
     elab:
       ttl: 30
       prefix-with: user_

+ 61 - 12
elab-spring/README.md

@@ -1,3 +1,7 @@
+---
+
+---
+
 # Elab-Spring
 
 该项目用来针对一些Spring的拓展做一些统一的封装使得在使用上非常方便
@@ -14,11 +18,17 @@
 
 ```
 
+------
+
+[TOC]
+
+
 
 ## 功能介绍
-#### SpringCommonConfig:基本的Spring相关的配置
 
-封装了ClientHttpRequestFactory、RestTemplate、PropertyPlaceholderConfigurer等类.
+### SpringCommonConfig:基本的Spring相关的配置
+
+封装了**ClientHttpRequestFactory**、**RestTemplate**、**PropertyPlaceholderConfigurer**等类.
 
 有一些可变的参数可以再配置文件中指定,这里面的数据都是默认值,可以不填写
 ```perl
@@ -31,7 +41,7 @@ spring.resources.path=classpath:*.properties
 ```
 
 
-#### DataSourceConfigBean : 数据源配置
+### DataSourceConfigBean : 数据源配置
 
 ```perl
 
@@ -46,7 +56,7 @@ default.maxActive=50
 ```
 
 
-#### JdbcBeanConfig : JDBC封装类配置
+### JdbcBeanConfig : JDBC封装类配置
 可选配置
 ```perl
 # jdbc的sql文件目录
@@ -57,7 +67,7 @@ jdbc.config.scan=com.elab.**
 
 ```
 
-#### TransactionConfigBean : 事物配置
+### TransactionConfigBean : 事务配置
 针对事物相关的类进行配置
 
 > 这里需要注意的是一般 TransactionConfigBean、JdbcBeanConfig 依赖 DataSourceConfigBean 所以使用的时候,需要将这三个类都一次性导入
@@ -72,16 +82,17 @@ jdbc.config.scan=com.elab.**
 mvc.multipartResolver.MaxUploadSize=10485760
 ```
 
-#### CommonException : 全局异常定义
+### CommonException : 全局异常定义
 直接注入就拥有全局异常功能
 
+- `BusinessException` : 该异常表示业务中出现的参数不对,以及一些不会记录Log的异常会直接封装成code+msg返回给前端
+- 
 
-
-#### LogResponseBodyAdvice : 日志id作为结果集返回
+### LogResponseBodyAdvice : 日志id作为结果集返回
 直接注入拥有全局返回日志id的功能
 
 
-#### SwaggerConfigBean : api对象配置
+### SwaggerConfigBean : api对象配置
 
 ```
 #是否开启swagger
@@ -101,9 +112,9 @@ swagger2.version=必填
 ```
 
 
-#### RestTemplateUtils
-- 新增IRestFallback回调接口
-    - DefaultRestFallBack 默认的回调 : 一旦请求出现异常,则将该次请求数据记录到`mng_http_failure_data`表中
+### RestTemplateUtils
+- 新增`IRestFallback`回调接口
+    - `DefaultRestFallBack` 默认的回调 : 一旦请求出现异常,则将该次请求数据记录到`mng_http_failure_data`表中
 > 如果业务有特殊处理,可以实现该接口去覆盖DefaultRestFallBack类的实现。
 
 ```sql
@@ -127,6 +138,7 @@ CREATE TABLE `mng_http_failure_data` (
 ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='http故障数据记录';
 ```
 **如何应用到业务中**
+
 1. 配置类
 ```java
 @Bean
@@ -159,4 +171,41 @@ String post = restTemplateUtils.post(url, jsonObject,
 
 ```
 
+### 异步线程
+
+里面封装了消息串联的逻辑,当异步线程产生时,会和主线程的消息进行串联。
+
+**将线程加入异步队列**
+
+加入进去的参数会先放入异步队列进行排队,然后通过消费线程消费该方法。
+
+```java
+// 希望被记录下来的消息内容
+Map<String,String> dataMap = new HashMap();
+dataMap.put("id","asdsa");
+ThreadProcessUtils.addRealTimeQueue(() -> {
+    logger.info("这是一个异步消息" + Cat.getCurrentMessageId());
+    // 做业务操作.
+}, dataMap);
+```
+
+**将加入调度队列**
+
+这里是负责周期性执行数据
+
+```java
+ThreadProcessUtils.addSchedulingList(()->{
+    System.out.println("这是一个调度操作" + Cat.getCurrentMessageId());
+});
+```
+
+**配置相关**
+
+```yaml
+spring:  
+  elab:
+    thread:
+      real-queue-size: 1000			# 异步队列大小
+      scheduling-interval-second: 30 # 调度间隔时长(秒)
+```
 

+ 6 - 0
elab-spring/pom.xml

@@ -36,6 +36,12 @@
             <artifactId>spring-boot-autoconfigure</artifactId>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <version>${springboot.version}</version>
+            <optional>true</optional>
+        </dependency>
 
         <dependency>
             <groupId>com.elab.log</groupId>

+ 25 - 0
elab-spring/src/main/java/com/elab/spring/anno/EnableElabSpring.java

@@ -0,0 +1,25 @@
+package com.elab.spring.anno;
+
+import com.elab.log.asepct.LogResponseBodyAdvice;
+import com.elab.spring.config.SpringMvcConfig;
+import com.elab.spring.config.SwaggerConfigBean;
+import com.elab.spring.config.ThreadConfiguration;
+import com.elab.spring.exception.CommonException;
+import org.springframework.context.annotation.Import;
+
+import java.lang.annotation.*;
+
+/**
+ * @Module 注解
+ * @Description 开启Spring内部主要功能
+ * @Author liukaixiong
+ * @Date 2020/12/4 10:42
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Documented
+//, SpringCommonConfig.class 有问题
+@Import({ThreadConfiguration.class, LogResponseBodyAdvice.class, CommonException.class, SwaggerConfigBean.class, SpringMvcConfig.class})
+public @interface EnableElabSpring {
+
+}

+ 2 - 4
elab-spring/src/main/java/com/elab/spring/callback/impl/DefaultRestFallBack.java

@@ -18,8 +18,6 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
 import org.springframework.http.HttpHeaders;
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.util.Arrays;
 import java.util.Date;
@@ -105,7 +103,7 @@ public class DefaultRestFallBack implements IRestFallback, ApplicationContextAwa
     }
 
     @Override
-    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
+//    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
     public Object post(String url, HttpHeaders httpHeaders, Object reqParam, Class clazz, Exception e) {
         if (this.isReload) {
             try {
@@ -223,7 +221,7 @@ public class DefaultRestFallBack implements IRestFallback, ApplicationContextAwa
     }
 
     @Override
-    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
+//    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
     public Object get(String url, Class clazz, Exception e) {
         if (this.httpFailureDataDao != null) {
             try {

+ 56 - 53
elab-spring/src/main/java/com/elab/spring/config/ThreadConfiguration.java

@@ -1,53 +1,56 @@
-//package com.elab.spring.config;
-//
-//import com.elab.core.async.consumer.TaskConsumer;
-//import com.elab.core.async.pruducer.ITaskProducer;
-//import com.elab.core.async.store.TaskExecutorQueue;
-//import com.elab.core.utils.DataUtils;
-//import com.elab.log.ext.CatTaskProducer;
-//import com.elab.spring.config.prop.ThreadProperties;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.boot.context.properties.EnableConfigurationProperties;
-//import org.springframework.context.annotation.Bean;
-//import org.springframework.context.annotation.Configuration;
-//
-//import java.util.concurrent.ExecutorCompletionService;
-//
-///**
-// * 线程配置
-// *
-// * @author : liukx
-// * @time : 2020/8/10 - 19:50
-// */
-//@Configuration
-//@EnableConfigurationProperties(ThreadProperties.class)
-//public class ThreadConfiguration {
-//
-//    @Autowired
-//    private ThreadProperties threadProperties;
-//
-//    @Bean
-//    public TaskExecutorQueue taskExecutorQueue() {
-//        Integer threadCore = DataUtils.getIntegerValue(threadProperties.getThreadCore(), 5);
-//        Integer realQueueSize = DataUtils.getIntegerValue(threadProperties.getRealQueueSize(), 1000);
-//        TaskExecutorQueue queue = new TaskExecutorQueue(threadCore, realQueueSize);
-//        return queue;
-//    }
-//
-//    @Bean
-//    public TaskConsumer taskConsumer(@Autowired TaskExecutorQueue taskExecutorQueue) {
-//        TaskConsumer taskConsumer = new TaskConsumer(taskExecutorQueue);
-//        // 开启定时调度
-//        taskConsumer.startSchedulingConsumer(DataUtils.getIntegerValue(threadProperties.getSchedulingIntervalSecond(), 5));
-//        // 开启异步队列
-//        taskConsumer.startRealTimeConsumer();
-//        return taskConsumer;
-//    }
-//
-//    @Bean
-//    public ITaskProducer taskProducer(@Autowired TaskExecutorQueue taskExecutorQueue) {
-//        ITaskProducer producer = new CatTaskProducer(taskExecutorQueue);
-//        return producer;
-//    }
-//
-//}
+package com.elab.spring.config;
+
+import com.elab.core.async.consumer.TaskConsumer;
+import com.elab.core.async.pruducer.ITaskProducer;
+import com.elab.core.async.store.TaskExecutorQueue;
+import com.elab.core.utils.DataUtils;
+import com.elab.log.ext.CatTaskProducer;
+import com.elab.spring.config.prop.ThreadProperties;
+import com.elab.spring.utils.ThreadProcessUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 线程配置
+ *
+ * @author : liukx
+ * @time : 2020/8/10 - 19:50
+ */
+@Configuration
+@EnableConfigurationProperties(ThreadProperties.class)
+public class ThreadConfiguration {
+
+    @Autowired
+    private ThreadProperties threadProperties;
+
+    @Bean
+    public TaskExecutorQueue taskExecutorQueue() {
+        Integer realQueueSize = DataUtils.getIntegerValue(threadProperties.getRealQueueSize(), 1000);
+        TaskExecutorQueue queue = new TaskExecutorQueue(realQueueSize);
+        return queue;
+    }
+
+    @Bean
+    public TaskConsumer taskConsumer(@Autowired TaskExecutorQueue taskExecutorQueue) {
+        TaskConsumer taskConsumer = new TaskConsumer(taskExecutorQueue);
+        // 开启定时调度
+        taskConsumer.startSchedulingConsumer(DataUtils.getIntegerValue(threadProperties.getSchedulingIntervalSecond(), 5));
+        // 开启异步队列
+        taskConsumer.startRealTimeConsumer();
+        return taskConsumer;
+    }
+
+    @Bean
+    public ITaskProducer taskProducer(@Autowired TaskExecutorQueue taskExecutorQueue) {
+        ITaskProducer producer = new CatTaskProducer(taskExecutorQueue);
+        return producer;
+    }
+
+    @Bean
+    public ThreadProcessUtils threadProcessUtils() {
+        return new ThreadProcessUtils();
+    }
+
+}

+ 3 - 15
elab-spring/src/main/java/com/elab/spring/config/prop/ThreadProperties.java

@@ -9,21 +9,17 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
  * @time : 2020/8/14 - 14:19
  */
 
-@ConfigurationProperties(prefix = "elab.thread")
+@ConfigurationProperties(prefix = "spring.elab.thread")
 public class ThreadProperties {
 
     /**
      * 调度间隔时间
      */
-    private Integer schedulingIntervalSecond;
-    /**
-     * 初始化核心线程池大小
-     */
-    private Integer threadCore;
+    private Integer schedulingIntervalSecond = 30;
     /**
      * 实时队列大小
      */
-    private Integer realQueueSize;
+    private Integer realQueueSize = 1000;
 
     public Integer getSchedulingIntervalSecond() {
         return schedulingIntervalSecond;
@@ -33,14 +29,6 @@ public class ThreadProperties {
         this.schedulingIntervalSecond = schedulingIntervalSecond;
     }
 
-    public Integer getThreadCore() {
-        return threadCore;
-    }
-
-    public void setThreadCore(Integer threadCore) {
-        this.threadCore = threadCore;
-    }
-
     public Integer getRealQueueSize() {
         return realQueueSize;
     }

+ 1 - 0
elab-spring/src/main/java/com/elab/spring/exception/CommonException.java

@@ -38,6 +38,7 @@ public class CommonException {
     private String defaultParamsError = "CORE.PARAMS.001";
     private String defaultNotFoundError = "CORE.NOT_FOUND";
     private String defaultMessage = "系统异常";
+
     @Autowired
     private Environment environment;
 

+ 1 - 1
elab-spring/src/main/java/com/elab/spring/utils/RestTemplateUtils.java

@@ -320,9 +320,9 @@ public class RestTemplateUtils {
             HttpEntity<Object> entity = new HttpEntity<Object>(body, httpHeaders);
             ResponseEntity<T> result = null;
             if (body == null) {
+                logger.debug(" DATA :" + body);
                 result = restTemplate.exchange(url, HttpMethod.GET, entity, clazz);
             } else {
-                // todo 待优化,由于每次都是创建的
                 result = getRestTemplate.exchange(url, HttpMethod.GET, entity, clazz);
             }
             responseData = result.getBody();

+ 45 - 0
elab-spring/src/main/java/com/elab/spring/utils/ThreadProcessUtils.java

@@ -0,0 +1,45 @@
+package com.elab.spring.utils;
+
+import com.elab.core.async.RealTaskExecutor;
+import com.elab.core.async.SchedulingTaskExecutor;
+import com.elab.core.async.model.TaskStoreData;
+import com.elab.core.async.pruducer.ITaskProducer;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+
+/**
+ * @Module 工具类
+ * @Description 线程执行工具类
+ * @Author liukaixiong
+ * @Date 2020/11/18 15:51
+ */
+public class ThreadProcessUtils implements ApplicationContextAware, InitializingBean {
+    private ApplicationContext applicationContext;
+
+    private static ITaskProducer taskProducer;
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        this.applicationContext = applicationContext;
+    }
+
+    public static void addRealTimeQueue(RealTaskExecutor taskExecutor, TaskStoreData taskStoreData) {
+        if (taskProducer != null) {
+            taskProducer.sendRealTimeQueue(taskExecutor, taskStoreData);
+        }
+    }
+
+    public static void addSchedulingList(SchedulingTaskExecutor schedulingTaskExecutor) {
+        if (taskProducer != null) {
+            taskProducer.sendSchedulingList(schedulingTaskExecutor);
+        }
+    }
+
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        taskProducer = this.applicationContext.getBean(ITaskProducer.class);
+    }
+}

+ 47 - 0
elab-spring/src/test/java/com/elab/spring/utils/ThreadProcessUtilsTest.java

@@ -0,0 +1,47 @@
+package com.elab.spring.utils;
+
+import com.dianping.cat.Cat;
+import com.dianping.cat.message.Transaction;
+import com.elab.spring.config.ThreadConfiguration;
+import junit.framework.TestCase;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * @Module TODO
+ * @Description TODO
+ * @Author liukaixiong
+ * @Date 2020/11/18 16:16
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = ThreadConfiguration.class)
+public class ThreadProcessUtilsTest extends TestCase {
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Test
+    public void testAddRealTimeQueue() throws Exception {
+        Transaction transaction = Cat.newTransaction("test", "msg");
+        logger.info("这时候开始处理 : " + Cat.getCurrentMessageId());
+        System.out.println("LOG : " + Cat.getCurrentMessageId());
+        ThreadProcessUtils.addRealTimeQueue(() -> {
+            logger.info("这是一个异步消息" + Cat.getCurrentMessageId());
+        }, null);
+        logger.info("处理完成了");
+        transaction.setSuccessStatus();
+        transaction.complete();
+        System.in.read();
+    }
+
+    @Test
+    public void testAddSchedulingList() throws Exception {
+        logger.info("sadfasdfsdfsad:::" + Cat.getCurrentMessageId());
+        ThreadProcessUtils.addSchedulingList(()->{
+            System.out.println("这是一个调度操作" + Cat.getCurrentMessageId());
+        });
+        System.in.read();
+    }
+}

+ 1 - 0
elab-spring/src/test/resources/META-INF/app.properties

@@ -0,0 +1 @@
+app.name=cat-spring-demo

+ 112 - 0
elab-spring/src/test/resources/META-INF/plexus/components-cat-client.xml

@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- THIS FILE WAS AUTO GENERATED FROM class com.dianping.cat.build.ComponentsConfigurator, DO NOT EDIT IT -->
+<plexus>
+	<components>
+		<component>
+			<role>com.dianping.cat.configuration.ClientConfigManager</role>
+			<implementation>com.dianping.cat.configuration.DefaultClientConfigManager</implementation>
+		</component>
+		<component>
+			<role>com.dianping.cat.message.internal.MessageIdFactory</role>
+			<implementation>com.dianping.cat.message.internal.MessageIdFactory</implementation>
+		</component>
+		<component>
+			<role>com.dianping.cat.message.spi.MessageManager</role>
+			<implementation>com.dianping.cat.message.internal.DefaultMessageManager</implementation>
+			<requirements>
+				<requirement>
+					<role>com.dianping.cat.configuration.ClientConfigManager</role>
+				</requirement>
+				<requirement>
+					<role>com.dianping.cat.message.io.TransportManager</role>
+				</requirement>
+				<requirement>
+					<role>com.dianping.cat.message.internal.MessageIdFactory</role>
+				</requirement>
+			</requirements>
+		</component>
+		<component>
+			<role>com.dianping.cat.message.MessageProducer</role>
+			<implementation>com.dianping.cat.message.internal.DefaultMessageProducer</implementation>
+			<!--<implementation>com.elab.log.message.CatMessageProducer</implementation>-->
+			<requirements>
+				<requirement>
+					<role>com.dianping.cat.message.spi.MessageManager</role>
+				</requirement>
+				<requirement>
+					<role>com.dianping.cat.message.internal.MessageIdFactory</role>
+				</requirement>
+			</requirements>
+		</component>
+		<component>
+			<role>com.dianping.cat.message.io.TcpSocketSender</role>
+			<implementation>com.dianping.cat.message.io.TcpSocketSender</implementation>
+			<requirements>
+				<requirement>
+					<role>com.dianping.cat.configuration.ClientConfigManager</role>
+				</requirement>
+				<requirement>
+					<role>com.dianping.cat.message.internal.MessageIdFactory</role>
+				</requirement>
+				<requirement>
+					<role>com.dianping.cat.message.spi.MessageStatistics</role>
+					<field-name>m_statistics</field-name>
+				</requirement>
+				<requirement>
+					<role>com.dianping.cat.message.spi.MessageCodec</role>
+					<role-hint>plain-text</role-hint>
+					<field-name>m_codec</field-name>
+				</requirement>
+			</requirements>
+		</component>
+		<component>
+			<role>com.dianping.cat.message.io.TransportManager</role>
+			<implementation>com.dianping.cat.message.io.DefaultTransportManager</implementation>
+			<requirements>
+				<requirement>
+					<role>com.dianping.cat.configuration.ClientConfigManager</role>
+				</requirement>
+				<requirement>
+					<role>com.dianping.cat.message.io.TcpSocketSender</role>
+				</requirement>
+			</requirements>
+		</component>
+		<component>
+			<role>com.dianping.cat.message.spi.MessageStatistics</role>
+			<implementation>com.dianping.cat.message.spi.internal.DefaultMessageStatistics</implementation>
+		</component>
+		<component>
+			<role>com.dianping.cat.status.StatusUpdateTask</role>
+			<implementation>com.dianping.cat.status.StatusUpdateTask</implementation>
+			<requirements>
+				<requirement>
+					<role>com.dianping.cat.message.spi.MessageStatistics</role>
+				</requirement>
+				<requirement>
+					<role>com.dianping.cat.configuration.ClientConfigManager</role>
+				</requirement>
+			</requirements>
+		</component>
+		<component>
+			<role>org.unidal.initialization.Module</role>
+			<role-hint>cat-client</role-hint>
+			<implementation>com.dianping.cat.CatClientModule</implementation>
+		</component>
+		<component>
+			<role>com.dianping.cat.message.spi.codec.BufferWriter</role>
+			<role-hint>escape</role-hint>
+			<implementation>com.dianping.cat.message.spi.codec.EscapingBufferWriter</implementation>
+		</component>
+		<component>
+			<role>com.dianping.cat.message.spi.MessageCodec</role>
+			<role-hint>plain-text</role-hint>
+			<implementation>com.dianping.cat.message.spi.codec.PlainTextMessageCodec</implementation>
+			<requirements>
+				<requirement>
+					<role>com.dianping.cat.message.spi.codec.BufferWriter</role>
+					<role-hint>escape</role-hint>
+				</requirement>
+			</requirements>
+		</component>
+	</components>
+</plexus>

+ 5 - 1
elab-spring/src/test/resources/application.yml

@@ -2,4 +2,8 @@ spring:
   profiles:
     active: dev
   application:
-    name: elab-spring
+    name: elab-spring
+  elab:
+    thread:
+      real-queue-size: 1000
+      scheduling-interval-second: 5

+ 13 - 3
elab-spring/src/test/resources/logback.xml

@@ -9,11 +9,21 @@
             <Pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n</Pattern>
         </encoder>
     </appender>
-    <appender name="cat" class="com.elab.log.log4j.CatLogbackLog">
-    </appender>
+
+    <appender name="cat" class="com.elab.log.log4j.CatLogbackLog"></appender>
+
+    <logger name="com.elab" level="INFO" additivity="false">
+        <appender-ref ref="cat"/>
+    </logger>
+
+    <logger name="org.springframework.boot" level="INFO" additivity="false">
+        <appender-ref ref="stdout"/>
+    </logger>
+
+
     <root level="INFO">
         <appender-ref ref="stdout"/>
         <appender-ref ref="cat"/>
     </root>
-    <logger name="com.elab" level="DEBUG" />
+    <!--    <logger name="com.elab" level="DEBUG" />-->
 </configuration>

+ 2 - 0
pom.xml

@@ -346,6 +346,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.1</version>
                 <configuration>
                     <source>${java-version}</source>
                     <target>${java-version}</target>
@@ -356,6 +357,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-source-plugin</artifactId>
+                <version>3.0.1</version>
                 <executions>
                     <execution>
                         <id>attach-sources</id>