package ${basePackage}.config; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; import org.springframework.beans.factory.support.BeanNameGenerator; import org.springframework.context.annotation.ClassPathBeanDefinitionScanner; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.core.type.filter.AssignableTypeFilter; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.stereotype.Component; import ${basePackage}.frame.schedule.RunTask; import ${basePackage}.frame.utils.LogUtil; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ScheduledFuture; /** * 计划调度配置,可以指定环境生效,根据实际情况是否需要开启 * 开启方法:将@Profile("dev") 删除(所有环境生效) 或改为对应环境 */ @Configuration @Component @Profile("dev") public class ScheduleConfig extends ThreadPoolTaskScheduler implements BeanDefinitionRegistryPostProcessor { private Map> classMap; private Map> futureMap; public ScheduleConfig() { classMap = new HashMap<>(); futureMap = new HashMap<>(); setPoolSize(4); initialize(); } public boolean createOrRepeat(RunTask task) { if (futureMap.containsKey(task.taskId())) { ScheduledFuture scheduledFuture = futureMap.get(task.taskId()); scheduledFuture.cancel(false); } classMap.put(task.taskId(), (Class) task.getClass()); futureMap.put(task.taskId(), task.schedule(this)); return true; } @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException { String aPackage = this.getClass().getPackage().getName(); Pattern compile = Pattern.compile("(.*)\\.config"); Matcher matcher = compile.matcher(aPackage); if (matcher.find()) { String basePackage = matcher.group(1); registryTask(basePackage + ".task", beanDefinitionRegistry); } } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException { } private int registryTask(String basePackage, BeanDefinitionRegistry beanDefinitionRegistry) { ClassPathBeanDefinitionScanner classPathBeanDefinitionScanner = new ClassPathBeanDefinitionScanner(beanDefinitionRegistry); classPathBeanDefinitionScanner.addIncludeFilter(new AssignableTypeFilter(RunTask.class)); classPathBeanDefinitionScanner.setBeanNameGenerator(new BeanNameGenerator() { @Override public String generateBeanName(BeanDefinition beanDefinition, BeanDefinitionRegistry beanDefinitionRegistry) { String beanClassName = beanDefinition.getBeanClassName(); try { Class aClass = Class.forName(beanClassName); Object instance = aClass.newInstance(); RunTask task = (RunTask) instance; ScheduleConfig.this.createOrRepeat(task); } catch (Exception e) { e.printStackTrace(); } LogUtil.i("registry task " + beanClassName); return beanClassName; } }); return classPathBeanDefinitionScanner.scan(basePackage); } }