diff --git a/threadnacosndemo/pom.xml b/threadnacosndemo/pom.xml new file mode 100644 index 0000000..0d0e33e --- /dev/null +++ b/threadnacosndemo/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.3.12.RELEASE + + + com.woniu.connection + threadconnectiondemo + 1.0-SNAPSHOT + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + 2.2.6.RELEASE + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + 2.2.6.RELEASE + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter + + + + \ No newline at end of file diff --git a/threadnacosndemo/src/main/java/com/woniu/connection/MainApplication.java b/threadnacosndemo/src/main/java/com/woniu/connection/MainApplication.java new file mode 100644 index 0000000..c95fd61 --- /dev/null +++ b/threadnacosndemo/src/main/java/com/woniu/connection/MainApplication.java @@ -0,0 +1,12 @@ +package com.woniu.connection; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class MainApplication { + + public static void main(String[] args) { + SpringApplication.run(MainApplication.class, args); + } +} diff --git a/threadnacosndemo/src/main/java/com/woniu/connection/config/DynamicThreadPool.java b/threadnacosndemo/src/main/java/com/woniu/connection/config/DynamicThreadPool.java new file mode 100644 index 0000000..0e9f198 --- /dev/null +++ b/threadnacosndemo/src/main/java/com/woniu/connection/config/DynamicThreadPool.java @@ -0,0 +1,111 @@ +package com.woniu.connection.config; + + +import com.alibaba.cloud.nacos.NacosConfigManager; +import com.alibaba.cloud.nacos.NacosConfigProperties; +import com.alibaba.nacos.api.config.listener.Listener; +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +import java.util.concurrent.*; + +/** + * Nacos作为服务配置中心, + * 实现一个简单的动态化线程池。 + * 修改线程池核心线程数、 + * 最大线程数为例, + */ +@RefreshScope +@Configuration +public class DynamicThreadPool implements InitializingBean { + @Value("${core.size}") + private String coreSize; + + @Value("${max.size}") + private String maxSize; + + private static ThreadPoolExecutor threadPoolExecutor; + + @Autowired + private NacosConfigManager nacosConfigManager; + + @Autowired + private NacosConfigProperties nacosConfigProperties; + + @Override + public void afterPropertiesSet() throws Exception { + //按照nacos配置初始化线程池 + threadPoolExecutor = new ThreadPoolExecutor(Integer.parseInt(coreSize), Integer.parseInt(maxSize), 10L, TimeUnit.SECONDS, + new LinkedBlockingQueue<>(10), + new ThreadFactoryBuilder().setNameFormat("c_t_%d").build(), + new RejectedExecutionHandler() { + @Override + public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { + System.out.println("rejected!"); + } + }); + + //nacos配置变更监听 + nacosConfigManager.getConfigService().addListener("order-service-dev.yml", nacosConfigProperties.getGroup(), + new Listener() { + @Override + public Executor getExecutor() { + return null; + } + + @Override + public void receiveConfigInfo(String configInfo) { + //配置变更,修改线程池配置 + System.out.println(configInfo); + changeThreadPoolConfig(Integer.parseInt(coreSize), Integer.parseInt(maxSize)); + } + }); + } + + /** + * 打印当前线程池的状态 + */ + public String printThreadPoolStatus() { + return String.format("core_size:%s,thread_current_size:%s;" + + "thread_max_size:%s;queue_current_size:%s,total_task_count:%s", threadPoolExecutor.getCorePoolSize(), + threadPoolExecutor.getActiveCount(), threadPoolExecutor.getMaximumPoolSize(), threadPoolExecutor.getQueue().size(), + threadPoolExecutor.getTaskCount()); + } + + /** + * 给线程池增加任务 + * + * @param count + */ + public void dynamicThreadPoolAddTask(int count) { + for (int i = 0; i < count; i++) { + int finalI = i; + threadPoolExecutor.execute(new Runnable() { + @Override + public void run() { + try { + System.out.println(finalI); + Thread.sleep(10000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }); + } + } + + /** + * 修改线程池核心参数 + * + * @param coreSize + * @param maxSize + */ + private void changeThreadPoolConfig(int coreSize, int maxSize) { + threadPoolExecutor.setCorePoolSize(coreSize); + threadPoolExecutor.setMaximumPoolSize(maxSize); + } +} \ No newline at end of file diff --git a/threadnacosndemo/src/main/java/com/woniu/connection/web/ThreadPoolController.java b/threadnacosndemo/src/main/java/com/woniu/connection/web/ThreadPoolController.java new file mode 100644 index 0000000..d170e65 --- /dev/null +++ b/threadnacosndemo/src/main/java/com/woniu/connection/web/ThreadPoolController.java @@ -0,0 +1,35 @@ +package com.woniu.connection.web; + + +import com.woniu.connection.config.DynamicThreadPool; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + + + +@RestController +@RequestMapping("/threadpool") +public class ThreadPoolController { + + @Autowired + private DynamicThreadPool dynamicThreadPool; + + /** + * 打印当前线程池的状态 + */ + @GetMapping("/print") + public String printThreadPoolStatus() { + return dynamicThreadPool.printThreadPoolStatus(); + } + + /** + * 给线程池增加任务 + * + * @param count + */ + @GetMapping("/add") + public String dynamicThreadPoolAddTask(int count) { + dynamicThreadPool.dynamicThreadPoolAddTask(count); + return String.valueOf(count); + } +} \ No newline at end of file diff --git a/threadnacosndemo/src/main/resources/application.yml b/threadnacosndemo/src/main/resources/application.yml new file mode 100644 index 0000000..caf4dfc --- /dev/null +++ b/threadnacosndemo/src/main/resources/application.yml @@ -0,0 +1,3 @@ +spring: + profiles: + active: dev \ No newline at end of file diff --git a/threadnacosndemo/src/main/resources/bootstrap.yml b/threadnacosndemo/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..c745e12 --- /dev/null +++ b/threadnacosndemo/src/main/resources/bootstrap.yml @@ -0,0 +1,15 @@ +server: + port: 8010 + # 应用名称(nacos会将该名称当做服务名称) +spring: + application: + name: woniu-service + cloud: + nacos: + discovery: + namespace: public + server-addr: 192.168.56.10:8848 + config: + server-addr: 192.168.56.10:8848 + file-extension: yml + diff --git a/threadnacosndemo/target/classes/application.yml b/threadnacosndemo/target/classes/application.yml new file mode 100644 index 0000000..caf4dfc --- /dev/null +++ b/threadnacosndemo/target/classes/application.yml @@ -0,0 +1,3 @@ +spring: + profiles: + active: dev \ No newline at end of file diff --git a/threadnacosndemo/target/classes/bootstrap.yml b/threadnacosndemo/target/classes/bootstrap.yml new file mode 100644 index 0000000..c745e12 --- /dev/null +++ b/threadnacosndemo/target/classes/bootstrap.yml @@ -0,0 +1,15 @@ +server: + port: 8010 + # 应用名称(nacos会将该名称当做服务名称) +spring: + application: + name: woniu-service + cloud: + nacos: + discovery: + namespace: public + server-addr: 192.168.56.10:8848 + config: + server-addr: 192.168.56.10:8848 + file-extension: yml + diff --git a/threadnacosndemo/target/classes/com/woniu/connection/MainApplication.class b/threadnacosndemo/target/classes/com/woniu/connection/MainApplication.class new file mode 100644 index 0000000..838ffa5 Binary files /dev/null and b/threadnacosndemo/target/classes/com/woniu/connection/MainApplication.class differ diff --git a/threadnacosndemo/target/classes/com/woniu/connection/config/DynamicThreadPool$1.class b/threadnacosndemo/target/classes/com/woniu/connection/config/DynamicThreadPool$1.class new file mode 100644 index 0000000..5f82998 Binary files /dev/null and b/threadnacosndemo/target/classes/com/woniu/connection/config/DynamicThreadPool$1.class differ diff --git a/threadnacosndemo/target/classes/com/woniu/connection/config/DynamicThreadPool$2.class b/threadnacosndemo/target/classes/com/woniu/connection/config/DynamicThreadPool$2.class new file mode 100644 index 0000000..5b446cf Binary files /dev/null and b/threadnacosndemo/target/classes/com/woniu/connection/config/DynamicThreadPool$2.class differ diff --git a/threadnacosndemo/target/classes/com/woniu/connection/config/DynamicThreadPool$3.class b/threadnacosndemo/target/classes/com/woniu/connection/config/DynamicThreadPool$3.class new file mode 100644 index 0000000..5a09702 Binary files /dev/null and b/threadnacosndemo/target/classes/com/woniu/connection/config/DynamicThreadPool$3.class differ diff --git a/threadnacosndemo/target/classes/com/woniu/connection/config/DynamicThreadPool.class b/threadnacosndemo/target/classes/com/woniu/connection/config/DynamicThreadPool.class new file mode 100644 index 0000000..8ea7208 Binary files /dev/null and b/threadnacosndemo/target/classes/com/woniu/connection/config/DynamicThreadPool.class differ diff --git a/threadnacosndemo/target/classes/com/woniu/connection/web/ThreadPoolController.class b/threadnacosndemo/target/classes/com/woniu/connection/web/ThreadPoolController.class new file mode 100644 index 0000000..9838ab1 Binary files /dev/null and b/threadnacosndemo/target/classes/com/woniu/connection/web/ThreadPoolController.class differ diff --git a/threadnacosndemo/threadconnectiondemo.iml b/threadnacosndemo/threadconnectiondemo.iml new file mode 100644 index 0000000..fa20781 --- /dev/null +++ b/threadnacosndemo/threadconnectiondemo.iml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file