Преглед на файлове

enhancement: #I1X83P 监控日志最好能加个开关,可以方便对日志启用和关闭。

bryan31 преди 4 години
родител
ревизия
78c2d89115

+ 7 - 2
liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeComponent.java

@@ -22,6 +22,9 @@ import com.yomahub.liteflow.entity.data.Slot;
 import com.yomahub.liteflow.entity.monitor.CompStatistics;
 import com.yomahub.liteflow.flow.FlowBus;
 import com.yomahub.liteflow.monitor.MonitorBus;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.annotation.Resource;
 
 public abstract class NodeComponent {
 
@@ -29,6 +32,9 @@ public abstract class NodeComponent {
 
 	private InheritableThreadLocal<Integer> slotIndexTL = new InheritableThreadLocal<Integer>();
 
+	@Resource
+	private MonitorBus monitorBus;
+
 	private String nodeId;
 
 	//是否结束整个流程,这个只对串行流程有效,并行流程无效
@@ -62,8 +68,7 @@ public abstract class NodeComponent {
 		CompStatistics statistics = new CompStatistics();
 		statistics.setComponentClazzName(this.getClass().getSimpleName());
 		statistics.setTimeSpent(timeSpent);
-		MonitorBus.load().addStatistics(statistics);
-
+		monitorBus.addStatistics(statistics);
 
 		if(this instanceof NodeCondComponent){
 			String condNodeId = slot.getCondResult(this.getClass().getName());

+ 49 - 14
liteflow-core/src/main/java/com/yomahub/liteflow/monitor/MonitorBus.java

@@ -21,6 +21,7 @@ import java.util.Map.Entry;
 import java.util.Timer;
 import java.util.concurrent.ConcurrentHashMap;
 
+import com.yomahub.liteflow.util.SpringAware;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -30,32 +31,34 @@ import com.yomahub.liteflow.util.LimitQueue;
 
 public class MonitorBus {
 
-	private static final int QUEUE_LIMIT_SIZE = 200;
+	private boolean enableMonitorLog = false;
 
-	private final Logger LOG = LoggerFactory.getLogger(this.getClass());
+	private int queueLimit = 200;
 
-	private ConcurrentHashMap<String, LimitQueue<CompStatistics>> statisticsMap = new ConcurrentHashMap<String, LimitQueue<CompStatistics>>();
+	private long delay = 5*60*1000;
+
+	private long period = 5*60*1000;
+
+	private Logger LOG = LoggerFactory.getLogger(this.getClass());
 
-	private static MonitorBus monitorBus;
+	private ConcurrentHashMap<String, LimitQueue<CompStatistics>> statisticsMap = new ConcurrentHashMap<String, LimitQueue<CompStatistics>>();
 
-	public static MonitorBus load(){
-		if(monitorBus == null){
-			monitorBus = new MonitorBus();
+	public MonitorBus(boolean enableMonitorLog, int queueLimit, long delay, long period) {
+		this.enableMonitorLog = enableMonitorLog;
+		this.queueLimit = queueLimit;
+		this.delay = delay;
+		this.period = period;
+		if(this.enableMonitorLog){
 			Timer timer = new Timer();
-			timer.schedule(new TimerTask() {
-				public void run() {
-					monitorBus.printStatistics();
-				}
-			}, 5*60*1000L, 5*60*1000L);
+			timer.schedule(new MonitorTimeTask(this), this.getDelay(), this.getPeriod());
 		}
-		return monitorBus;
 	}
 
 	public void addStatistics(CompStatistics statistics){
 		if(statisticsMap.containsKey(statistics.getComponentClazzName())){
 			statisticsMap.get(statistics.getComponentClazzName()).offer(statistics);
 		}else{
-			LimitQueue<CompStatistics> queue = new LimitQueue<CompStatistics>(QUEUE_LIMIT_SIZE);
+			LimitQueue<CompStatistics> queue = new LimitQueue<CompStatistics>(queueLimit);
 			queue.offer(statistics);
 			statisticsMap.put(statistics.getComponentClazzName(), queue);
 		}
@@ -99,4 +102,36 @@ public class MonitorBus {
 			LOG.error("print statistics cause error",e);
 		}
 	}
+
+	public boolean isEnableMonitorLog() {
+		return enableMonitorLog;
+	}
+
+	public void setEnableMonitorLog(boolean enableMonitorLog) {
+		this.enableMonitorLog = enableMonitorLog;
+	}
+
+	public int getQueueLimit() {
+		return queueLimit;
+	}
+
+	public void setQueueLimit(int queueLimit) {
+		this.queueLimit = queueLimit;
+	}
+
+	public long getDelay() {
+		return delay;
+	}
+
+	public void setDelay(long delay) {
+		this.delay = delay;
+	}
+
+	public long getPeriod() {
+		return period;
+	}
+
+	public void setPeriod(long period) {
+		this.period = period;
+	}
 }

+ 17 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/monitor/MonitorTimeTask.java

@@ -0,0 +1,17 @@
+package com.yomahub.liteflow.monitor;
+
+import java.util.TimerTask;
+
+public class MonitorTimeTask extends TimerTask {
+
+    private MonitorBus monitorBus;
+
+    public MonitorTimeTask(MonitorBus monitorBus) {
+        this.monitorBus = monitorBus;
+    }
+
+    @Override
+    public void run() {
+        monitorBus.printStatistics();
+    }
+}

+ 55 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/util/SpringAware.java

@@ -0,0 +1,55 @@
+package com.yomahub.liteflow.util;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.beans.factory.support.DefaultListableBeanFactory;
+import org.springframework.beans.factory.support.GenericBeanDefinition;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+
+public class SpringAware implements ApplicationContextAware {
+    private static final Logger log = LoggerFactory.getLogger(SpringAware.class);
+    private static ApplicationContext applicationContext = null;
+
+    public SpringAware() {
+    }
+
+    public void setApplicationContext(ApplicationContext ac) throws BeansException {
+        applicationContext = ac;
+    }
+
+    public static ApplicationContext getApplicationContext() {
+        return applicationContext;
+    }
+
+    public static <T> T getBean(String name) {
+        return (T) applicationContext.getBean(name);
+    }
+
+    public static <T> T getBean(Class<T> clazz) {
+        return applicationContext.getBean(clazz);
+    }
+
+    public static <T> T registerBean(Class<T> c) {
+        DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory)applicationContext.getAutowireCapableBeanFactory();
+        BeanDefinition beanDefinition = new GenericBeanDefinition();
+        beanDefinition.setBeanClassName(c.getName());
+        beanFactory.registerBeanDefinition(c.getName(), beanDefinition);
+        return getBean(c.getName());
+    }
+
+    public static <T> T registerOrGet(Class<T> clazz){
+        T t = null;
+        try{
+            t = SpringAware.getBean(clazz);
+        }catch (NoSuchBeanDefinitionException e){
+            if(t == null){
+                t = SpringAware.registerBean(clazz);
+            }
+        }
+        return t;
+    }
+}

+ 18 - 1
liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/LiteflowAutoConfiguration.java

@@ -2,7 +2,9 @@ package com.yomahub.liteflow.springboot;
 
 import com.google.common.collect.Lists;
 import com.yomahub.liteflow.core.FlowExecutor;
+import com.yomahub.liteflow.monitor.MonitorBus;
 import com.yomahub.liteflow.spring.ComponentScaner;
+import com.yomahub.liteflow.util.SpringAware;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -12,7 +14,7 @@ import org.springframework.context.annotation.Configuration;
 import java.util.List;
 
 @Configuration
-@EnableConfigurationProperties(LiteflowProperty.class)
+@EnableConfigurationProperties({LiteflowProperty.class,LiteflowMonitorProperty.class})
 @ConditionalOnProperty(prefix = "liteflow", name = "rule-source")
 public class LiteflowAutoConfiguration {
 
@@ -32,4 +34,19 @@ public class LiteflowAutoConfiguration {
             return null;
         }
     }
+
+    @Bean
+    public LiteflowExecutorInit liteflowExecutorInit(FlowExecutor flowExecutor){
+        return new LiteflowExecutorInit(flowExecutor);
+    }
+
+    @Bean
+    public SpringAware springAware(){
+        return new SpringAware();
+    }
+
+    @Bean
+    public MonitorBus monitorBus(LiteflowMonitorProperty property){
+        return new MonitorBus(property.isEnableLog(), property.getQueueLimit(), property.getDelay(), property.getPeriod());
+    }
 }

+ 47 - 0
liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/LiteflowMonitorProperty.java

@@ -0,0 +1,47 @@
+package com.yomahub.liteflow.springboot;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@ConfigurationProperties(prefix = "liteflow.monitor", ignoreUnknownFields = true)
+public class LiteflowMonitorProperty {
+
+    private boolean enableLog = false;
+
+    private int queueLimit = 200;
+
+    private long delay = 5*60*1000;
+
+    private long period = 5*60*1000;
+
+    public boolean isEnableLog() {
+        return enableLog;
+    }
+
+    public void setEnableLog(boolean enableLog) {
+        this.enableLog = enableLog;
+    }
+
+    public int getQueueLimit() {
+        return queueLimit;
+    }
+
+    public void setQueueLimit(int queueLimit) {
+        this.queueLimit = queueLimit;
+    }
+
+    public long getDelay() {
+        return delay;
+    }
+
+    public void setDelay(long delay) {
+        this.delay = delay;
+    }
+
+    public long getPeriod() {
+        return period;
+    }
+
+    public void setPeriod(long period) {
+        this.period = period;
+    }
+}

+ 3 - 0
liteflow-test-springboot/src/main/resources/application.properties

@@ -1 +1,4 @@
 liteflow.ruleSource=config/flow.xml
+liteflow.monitor.enable-log=true
+liteflow.monitor.delay=0
+liteflow.monitor.period=60000