mxd 3 роки тому
батько
коміт
998d0a53c8

+ 17 - 17
magic-api-plugins/magic-api-plugin-task/src/main/java/org/ssssssss/magicapi/task/service/TaskMagicDynamicRegistry.java

@@ -46,24 +46,24 @@ public class TaskMagicDynamicRegistry extends AbstractMagicDynamicRegistry<TaskI
 	@Override
 	protected boolean register(MappingNode<TaskInfo> mappingNode) {
 		TaskInfo info = mappingNode.getEntity();
-		CronTask cronTask = new CronTask(() -> {
-			TaskInfo entity = mappingNode.getEntity();
-			String scriptName = MagicConfiguration.getMagicResourceService().getScriptName(entity);
-			if(entity.isEnabled()){
-				try {
-					logger.info("定时任务:[{}]开始执行", scriptName);
-					MagicScriptContext magicScriptContext = new MagicScriptContext();
-					magicScriptContext.setScriptName(scriptName);
-					ScriptManager.executeScript(entity.getScript(), magicScriptContext);
-				} catch (Exception e) {
-					logger.error("定时任务执行出错", e);
-				} finally {
-					logger.info("定时任务:[{}]执行完毕", scriptName);
-				}
-			}
-		}, info.getCron());
-		mappingNode.setMappingData(taskScheduler.schedule(cronTask.getRunnable(), cronTask.getTrigger()));
 		if(taskScheduler != null){
+			CronTask cronTask = new CronTask(() -> {
+				TaskInfo entity = mappingNode.getEntity();
+				String scriptName = MagicConfiguration.getMagicResourceService().getScriptName(entity);
+				if(entity.isEnabled()){
+					try {
+						logger.info("定时任务:[{}]开始执行", scriptName);
+						MagicScriptContext magicScriptContext = new MagicScriptContext();
+						magicScriptContext.setScriptName(scriptName);
+						ScriptManager.executeScript(entity.getScript(), magicScriptContext);
+					} catch (Exception e) {
+						logger.error("定时任务执行出错", e);
+					} finally {
+						logger.info("定时任务:[{}]执行完毕", scriptName);
+					}
+				}
+			}, info.getCron());
+			mappingNode.setMappingData(taskScheduler.schedule(cronTask.getRunnable(), cronTask.getTrigger()));
 			logger.debug("注册定时任务:[{},{}]", MagicConfiguration.getMagicResourceService().getScriptName(info), info.getCron());
 		} else {
 			logger.debug("注册定时任务失败:[{}, {}], 当前 TaskScheduler 为空", MagicConfiguration.getMagicResourceService().getScriptName(info), info.getCron());

+ 20 - 5
magic-api-plugins/magic-api-plugin-task/src/main/java/org/ssssssss/magicapi/task/starter/MagicAPITaskConfiguration.java

@@ -1,10 +1,10 @@
 package org.ssssssss.magicapi.task.starter;
 
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.scheduling.TaskScheduler;
-import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
 import org.ssssssss.magicapi.core.config.MagicPluginConfiguration;
 import org.ssssssss.magicapi.core.model.Plugin;
 import org.ssssssss.magicapi.core.web.MagicControllerRegister;
@@ -13,9 +13,15 @@ import org.ssssssss.magicapi.task.service.TaskMagicDynamicRegistry;
 import org.ssssssss.magicapi.task.web.MagicTaskController;
 
 @Configuration
-@EnableScheduling
+@EnableConfigurationProperties(MagicTaskConfig.class)
 public class MagicAPITaskConfiguration implements MagicPluginConfiguration {
 
+	private final MagicTaskConfig config;
+
+	public MagicAPITaskConfiguration(MagicTaskConfig config) {
+		this.config = config;
+	}
+
 	@Bean
 	@ConditionalOnMissingBean
 	public TaskInfoMagicResourceStorage taskInfoMagicResourceStorage() {
@@ -24,8 +30,17 @@ public class MagicAPITaskConfiguration implements MagicPluginConfiguration {
 
 	@Bean
 	@ConditionalOnMissingBean
-	public TaskMagicDynamicRegistry taskMagicDynamicRegistry(TaskInfoMagicResourceStorage taskInfoMagicResourceStorage, TaskScheduler taskScheduler) {
-		return new TaskMagicDynamicRegistry(taskInfoMagicResourceStorage, taskScheduler);
+	public TaskMagicDynamicRegistry taskMagicDynamicRegistry(TaskInfoMagicResourceStorage taskInfoMagicResourceStorage) {
+		MagicTaskConfig.Shutdown shutdown = config.getShutdown();
+		ThreadPoolTaskScheduler poolTaskScheduler = new ThreadPoolTaskScheduler();
+		poolTaskScheduler.setPoolSize(config.getPool().getSize());
+		poolTaskScheduler.setWaitForTasksToCompleteOnShutdown(shutdown.isAwaitTermination());
+		if(shutdown.getAwaitTerminationPeriod() != null){
+			poolTaskScheduler.setAwaitTerminationSeconds((int) shutdown.getAwaitTerminationPeriod().getSeconds());
+		}
+		poolTaskScheduler.setThreadNamePrefix(config.getThreadNamePrefix());
+		poolTaskScheduler.initialize();
+		return new TaskMagicDynamicRegistry(taskInfoMagicResourceStorage, poolTaskScheduler);
 	}
 
 	@Override

+ 88 - 0
magic-api-plugins/magic-api-plugin-task/src/main/java/org/ssssssss/magicapi/task/starter/MagicTaskConfig.java

@@ -0,0 +1,88 @@
+package org.ssssssss.magicapi.task.starter;
+
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+import java.time.Duration;
+
+@ConfigurationProperties("magic-api.task")
+public class MagicTaskConfig {
+
+	/**
+	 * 线程池相关配置
+	 */
+	private final Pool pool = new Pool();
+
+	/**
+	 * 关闭时相关配置
+	 */
+	private final Shutdown shutdown = new Shutdown();
+
+	/**
+	 * 线程池前缀
+	 */
+	private String threadNamePrefix = "magic-task-";
+
+	public Pool getPool() {
+		return this.pool;
+	}
+
+	public Shutdown getShutdown() {
+		return this.shutdown;
+	}
+
+	public String getThreadNamePrefix() {
+		return this.threadNamePrefix;
+	}
+
+	public void setThreadNamePrefix(String threadNamePrefix) {
+		this.threadNamePrefix = threadNamePrefix;
+	}
+
+	public static class Pool {
+
+		/**
+		 * 线程池大小
+		 */
+		private int size = Runtime.getRuntime().availableProcessors();
+
+		public int getSize() {
+			return this.size;
+		}
+
+		public void setSize(int size) {
+			this.size = size;
+		}
+
+	}
+
+	public static class Shutdown {
+
+		/**
+		 * 关闭时是否等待任务执行完毕,默认为false
+		 */
+		private boolean awaitTermination;
+
+		/**
+		 * 关闭时最多等待任务执行完毕的时间
+		 */
+		private Duration awaitTerminationPeriod;
+
+		public boolean isAwaitTermination() {
+			return this.awaitTermination;
+		}
+
+		public void setAwaitTermination(boolean awaitTermination) {
+			this.awaitTermination = awaitTermination;
+		}
+
+		public Duration getAwaitTerminationPeriod() {
+			return this.awaitTerminationPeriod;
+		}
+
+		public void setAwaitTerminationPeriod(Duration awaitTerminationPeriod) {
+			this.awaitTerminationPeriod = awaitTerminationPeriod;
+		}
+
+	}
+}