1. 依赖
<!-- nacos做 配置中心 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.配置
spring.application.name=consumer-dome1
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
# 在spring cloud gateway中不起作用,必须配置在 spring boot web 中
#server.servlet.context-path=/demo
# 若nacos开启了鉴权功能 即 nacos.core.auth.enabled=true,需要配置账号和密码
# nacos用户名
spring.cloud.nacos.username=nacos
# nacos密码
spring.cloud.nacos.password=nacos
#nacos配置中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
#配置文件类型
spring.cloud.nacos.config.file-extension=properties
#指定加载配置文件
spring.config.import=optional:nacos:${spring.application.name}.${spring.cloud.nacos.config.file-extension}
3.创建一个单例线程池
public class SingleThreadPoolExecutor {
private static final int CORE_SIZE = Runtime.getRuntime().availableProcessors();
private static final int MAX_SIZE = CORE_SIZE * 2;
/**
* 1.共享可见
* 2.禁止指令重排
*/
private static volatile ThreadPoolExecutor threadPoolExecutor;
/**
* 构造器私有化
* */
private SingleThreadPoolExecutor() {
throw new RuntimeException("禁止反射调用!");
}
/**
* 双重检测锁
* 1.防止高并发下线程争夺共享资源
* 2.提高效率
* */
public static ThreadPoolExecutor getThreadPoolExecutor() {
if (threadPoolExecutor == null) {
synchronized(SingleThreadPoolExecutor.class) {
if (threadPoolExecutor == null) {
threadPoolExecutor = new ThreadPoolExecutor(CORE_SIZE, MAX_SIZE, 0L, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
}
}
}
return threadPoolExecutor;
}
}
4.监听nocos配置变更:更新线程核心线程数及最大线程数
@Configuration
@RefreshScope
@Data
public class GlobalRefreshConfig {
@Value("${datasource.change.switch}")
private String datasourceChangeSwitch;
@Value("${global.thread.pool.core}")
private Integer threadPoolCore;
@Value("${global.thread.pool.max}")
private Integer threadPoolMax;
}
@Configuration
public class SingleThreadPoolConfig implements InitializingBean{
static ThreadPoolExecutor threadPoolExecutor = SingleThreadPoolExecutor.getThreadPoolExecutor();
@Autowired
private GlobalRefreshConfig globalRefreshConfig;
@Autowired
private NacosConfigManager nacosConfigManager;
@Autowired
private NacosConfigProperties nacosConfigProperties;
@Override
public void afterPropertiesSet() throws Exception {
nacosConfigManager.getConfigService().addListener("consumer-dome1.properties", nacosConfigProperties.getGroup(),
new Listener() {
@Override
public Executor getExecutor() {
System.out.println("exe getExecutor");
return null;
}
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("exe receiveConfigInfo");
//该方法体在配置变更时就会立即执行,此时@RefreshScope注解还未加载完毕,配置不会立即生效,需要延时一段时间
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
threadPoolExecutor.setCorePoolSize(globalRefreshConfig.getThreadPoolCore());
threadPoolExecutor.setMaximumPoolSize(globalRefreshConfig.getThreadPoolMax());
}
});
}
}
注意:核心线程数不得大于最大线程数,