package com.estate.expert.admin.config; import com.estate.expert.common.AppRuntime; import com.estate.expert.common.log.RequestLogAspect; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.task.TaskExecutorBuilder; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.scheduling.annotation.AsyncAnnotationBeanPostProcessor; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Component; import java.util.AbstractMap; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.stream.Collectors; import static org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME; /** * 全局配置 * @author code */ @Slf4j public class GlobalConfig { @Value("${spring.application.name}") private String appName; @Value("${spring.application.id}") private String appId; @Bean ScheduledThreadPoolExecutor scheduledThreadPoolExecutor() { return new ScheduledThreadPoolExecutor(1); } /** * XXX Spring默认配置当有Executor的bean后不再装载TaskExecutor, 这里因为手动注册了 * {@link #scheduledThreadPoolExecutor}会导致spring不再自动注册TaskExecutor, 因此需要去掉ConditionalOnMissingBean的限制. * 参考{@link TaskExecutionAutoConfiguration#applicationTaskExecutor} */ @Bean(name = {APPLICATION_TASK_EXECUTOR_BEAN_NAME, AsyncAnnotationBeanPostProcessor.DEFAULT_TASK_EXECUTOR_BEAN_NAME}) public ThreadPoolTaskExecutor applicationTaskExecutor(TaskExecutorBuilder builder) { return builder.build(); } @Bean public RequestLogAspect requestLogAspect() { return new RequestLogAspect(); } @Bean AppRuntime appRuntime(ApplicationContext applicationContext) { return AppRuntime.builder().appId(appId).appName(appName).applicationContext(applicationContext).build(); } @Data @Component @EnableConfigurationProperties @ConfigurationProperties(prefix = "web.frequency-alert") public static class RuleConfig { private List rules; public Map getAlertRuleMap() { if (rules == null) { return Collections.emptyMap(); } return rules.stream() .map(e -> { String[] split = e.split(":"); return new AbstractMap.SimpleEntry<>(split[0], split[1]); }).collect(Collectors.toMap(AbstractMap.SimpleEntry::getKey, AbstractMap.SimpleEntry::getValue)); } } }