63 changed files with 1394 additions and 295 deletions
@ -0,0 +1,93 @@ |
|||
package com.epmet.commons.tools.config; |
|||
|
|||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
|||
import org.springframework.boot.context.properties.EnableConfigurationProperties; |
|||
import org.springframework.context.annotation.Bean; |
|||
import org.springframework.context.annotation.Configuration; |
|||
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; |
|||
|
|||
import java.util.concurrent.Executor; |
|||
import java.util.concurrent.ExecutorService; |
|||
import java.util.concurrent.RejectedExecutionHandler; |
|||
import java.util.concurrent.ThreadPoolExecutor; |
|||
|
|||
/** |
|||
* 线程池配置类 |
|||
* thread: |
|||
* # 线程池配置 |
|||
* threadPool: |
|||
* enableCustomize: true [true会使用自定义线程池,false则使用springboot自动配置的线程池。推荐使用自定义线程池] |
|||
* 可以只配置此参数,其他参会会使用默认值,但还是建议把参数配置全。 |
|||
* corePoolSize: 2 |
|||
* maxPoolSize: 4 |
|||
* queueCapacity: 2 |
|||
* keepAliveSeconds: 60 |
|||
* threadNamePrefix: [线程池名字] |
|||
* rejectedExecutionHandler: [拒绝策略] |
|||
* |
|||
* 顺序:核心线程->放入队列->未达到maxPoolSize则继续增加线程直到达到maxPoolSize->拒绝策略 |
|||
* 开启自定义线程池:thread.threadPool.enableCustomize=true,不配置或者配置为false,自定义线程池都不会开启 |
|||
* rejectedExecutionHandler拒绝策略:abortPolicy/discardPolicy/discardOldestPolicy/callerRunsPolicy(默认) |
|||
*/ |
|||
@EnableConfigurationProperties(EpmetThreadPoolProperties.class) |
|||
@Configuration |
|||
@ConditionalOnProperty(prefix = "thread.threadPool", name = "enableCustomize", havingValue = "true", matchIfMissing = false) |
|||
public class AsyncConfig { |
|||
|
|||
/** |
|||
* 默认值 |
|||
*/ |
|||
private int corePoolSize = 5; |
|||
private int maxPoolSize = 8; |
|||
private int queueCapacity = 20; |
|||
private String threadNamePrefix = "epmet-default-"; |
|||
private int keepAliveSeconds = 60; |
|||
private String rejectedExecutionHandler = "callerRunsPolicy"; |
|||
|
|||
public AsyncConfig(EpmetThreadPoolProperties properties) { |
|||
if (properties.getCorePoolSize() != null) corePoolSize = properties.getCorePoolSize(); |
|||
if (properties.getMaxPoolSize() != null) maxPoolSize = properties.getMaxPoolSize(); |
|||
if (properties.getQueueCapacity() != null) queueCapacity = properties.getQueueCapacity(); |
|||
if (properties.getThreadNamePrefix() != null) threadNamePrefix = properties.getThreadNamePrefix(); |
|||
if (properties.getKeepAliveSeconds() != null) keepAliveSeconds = properties.getKeepAliveSeconds(); |
|||
if (properties.getRejectedExecutionHandler() != null) rejectedExecutionHandler = properties.getRejectedExecutionHandler(); |
|||
} |
|||
|
|||
@Bean |
|||
public Executor executor() { |
|||
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); |
|||
executor.setCorePoolSize(corePoolSize); |
|||
executor.setMaxPoolSize(maxPoolSize); |
|||
executor.setQueueCapacity(queueCapacity); |
|||
executor.setThreadNamePrefix(threadNamePrefix); |
|||
executor.setRejectedExecutionHandler(getRejectedExecutionHandler(rejectedExecutionHandler)); //对拒绝task的处理策略
|
|||
executor.setKeepAliveSeconds(keepAliveSeconds); |
|||
executor.initialize(); |
|||
return executor; |
|||
} |
|||
|
|||
@Bean |
|||
public ExecutorService executorService() { |
|||
ThreadPoolTaskExecutor executor = (ThreadPoolTaskExecutor) executor(); |
|||
return executor.getThreadPoolExecutor(); |
|||
} |
|||
|
|||
/** |
|||
* 获取拒绝策略handler |
|||
* @param policy |
|||
* @return |
|||
*/ |
|||
private RejectedExecutionHandler getRejectedExecutionHandler(String policy) { |
|||
switch (policy) { |
|||
case "abortPolicy": |
|||
return new ThreadPoolExecutor.AbortPolicy(); |
|||
case "discardPolicy": |
|||
return new ThreadPoolExecutor.DiscardPolicy(); |
|||
case "discardOldestPolicy": |
|||
return new ThreadPoolExecutor.DiscardOldestPolicy(); |
|||
default: |
|||
// 默认情况下,使用主线程执行
|
|||
return new ThreadPoolExecutor.CallerRunsPolicy(); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,47 @@ |
|||
package com.epmet.commons.tools.config; |
|||
|
|||
import lombok.Data; |
|||
import org.springframework.boot.context.properties.ConfigurationProperties; |
|||
|
|||
/** |
|||
* 线程池配置参数 |
|||
* thread-pool会自动对应到threadPool |
|||
*/ |
|||
@ConfigurationProperties(prefix = "thread.thread-pool") |
|||
@Data |
|||
public class EpmetThreadPoolProperties { |
|||
|
|||
/** |
|||
* 是否允许自定义线程池 |
|||
*/ |
|||
private Boolean enableCustomize; |
|||
/** |
|||
* 核心线程数 |
|||
*/ |
|||
private Integer corePoolSize; |
|||
|
|||
/** |
|||
* 最大线程数 |
|||
*/ |
|||
private Integer maxPoolSize; |
|||
|
|||
/** |
|||
* 队列容量 |
|||
*/ |
|||
private Integer queueCapacity; |
|||
|
|||
/** |
|||
* 线程名前缀 |
|||
*/ |
|||
private String threadNamePrefix; |
|||
|
|||
/** |
|||
* 线程存活时长 |
|||
*/ |
|||
private Integer keepAliveSeconds; |
|||
|
|||
/** |
|||
* 拒绝策略 |
|||
*/ |
|||
private String rejectedExecutionHandler; |
|||
} |
@ -1,49 +0,0 @@ |
|||
package com.epmet.config; |
|||
|
|||
import com.epmet.properties.ThreadProperties; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.boot.context.properties.EnableConfigurationProperties; |
|||
import org.springframework.context.annotation.Bean; |
|||
import org.springframework.context.annotation.Configuration; |
|||
import org.springframework.scheduling.annotation.EnableAsync; |
|||
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; |
|||
|
|||
import java.util.concurrent.Executor; |
|||
import java.util.concurrent.ExecutorService; |
|||
import java.util.concurrent.ThreadPoolExecutor; |
|||
|
|||
/** |
|||
* 线程池配置类 |
|||
*/ |
|||
@Configuration |
|||
@EnableConfigurationProperties(ThreadProperties.class) |
|||
@EnableAsync |
|||
public class AsyncConfig { |
|||
|
|||
@Autowired |
|||
private ThreadProperties threadProperties; |
|||
|
|||
@Bean |
|||
public Executor executor() { |
|||
ThreadProperties.ThreadPoolProperties threadPoolProps = threadProperties.getThreadPool(); |
|||
|
|||
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); |
|||
executor.setCorePoolSize(threadPoolProps.getCorePoolSize()); |
|||
executor.setMaxPoolSize(threadPoolProps.getMaxPoolSize()); |
|||
executor.setQueueCapacity(threadPoolProps.getQueueCapacity()); |
|||
executor.setThreadNamePrefix("data-stats-"); |
|||
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
|
|||
// CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行
|
|||
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //对拒绝task的处理策略
|
|||
executor.setKeepAliveSeconds(threadPoolProps.getKeepAlive()); |
|||
executor.initialize(); |
|||
return executor; |
|||
} |
|||
|
|||
@Bean |
|||
public ExecutorService executorService() { |
|||
ThreadPoolTaskExecutor executor = (ThreadPoolTaskExecutor) executor(); |
|||
return executor.getThreadPoolExecutor(); |
|||
} |
|||
|
|||
} |
@ -1,49 +0,0 @@ |
|||
package com.epmet.config; |
|||
|
|||
import com.epmet.properties.ThreadProperties; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.boot.context.properties.EnableConfigurationProperties; |
|||
import org.springframework.context.annotation.Bean; |
|||
import org.springframework.context.annotation.Configuration; |
|||
import org.springframework.scheduling.annotation.EnableAsync; |
|||
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; |
|||
|
|||
import java.util.concurrent.Executor; |
|||
import java.util.concurrent.ExecutorService; |
|||
import java.util.concurrent.ThreadPoolExecutor; |
|||
|
|||
/** |
|||
* 线程池配置类 |
|||
*/ |
|||
@Configuration |
|||
@EnableConfigurationProperties(ThreadProperties.class) |
|||
@EnableAsync |
|||
public class AsyncConfig { |
|||
|
|||
@Autowired |
|||
private ThreadProperties threadProperties; |
|||
|
|||
@Bean |
|||
public Executor executor() { |
|||
ThreadProperties.ThreadPoolProperties threadPoolProps = threadProperties.getThreadPool(); |
|||
|
|||
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); |
|||
executor.setCorePoolSize(threadPoolProps.getCorePoolSize()); |
|||
executor.setMaxPoolSize(threadPoolProps.getMaxPoolSize()); |
|||
executor.setQueueCapacity(threadPoolProps.getQueueCapacity()); |
|||
executor.setThreadNamePrefix("epmet-message-"); |
|||
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
|
|||
// CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行
|
|||
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //对拒绝task的处理策略
|
|||
executor.setKeepAliveSeconds(threadPoolProps.getKeepAlive()); |
|||
executor.initialize(); |
|||
return executor; |
|||
} |
|||
|
|||
@Bean |
|||
public ExecutorService executorService() { |
|||
ThreadPoolTaskExecutor executor = (ThreadPoolTaskExecutor) executor(); |
|||
return executor.getThreadPoolExecutor(); |
|||
} |
|||
|
|||
} |
@ -1,49 +0,0 @@ |
|||
package com.epmet.config; |
|||
|
|||
import com.epmet.properties.ThreadProperties; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.boot.context.properties.EnableConfigurationProperties; |
|||
import org.springframework.context.annotation.Bean; |
|||
import org.springframework.context.annotation.Configuration; |
|||
import org.springframework.scheduling.annotation.EnableAsync; |
|||
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; |
|||
|
|||
import java.util.concurrent.Executor; |
|||
import java.util.concurrent.ExecutorService; |
|||
import java.util.concurrent.ThreadPoolExecutor; |
|||
|
|||
/** |
|||
* 线程池配置类 |
|||
*/ |
|||
@Configuration |
|||
@EnableConfigurationProperties(ThreadProperties.class) |
|||
@EnableAsync |
|||
public class AsyncConfig { |
|||
|
|||
@Autowired |
|||
private ThreadProperties threadProperties; |
|||
|
|||
@Bean |
|||
public Executor executor() { |
|||
ThreadProperties.ThreadPoolProperties threadPoolProps = threadProperties.getThreadPool(); |
|||
|
|||
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); |
|||
executor.setCorePoolSize(threadPoolProps.getCorePoolSize()); |
|||
executor.setMaxPoolSize(threadPoolProps.getMaxPoolSize()); |
|||
executor.setQueueCapacity(threadPoolProps.getQueueCapacity()); |
|||
executor.setThreadNamePrefix("epmet-point-"); |
|||
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
|
|||
// CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行
|
|||
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //对拒绝task的处理策略
|
|||
executor.setKeepAliveSeconds(threadPoolProps.getKeepAlive()); |
|||
executor.initialize(); |
|||
return executor; |
|||
} |
|||
|
|||
@Bean |
|||
public ExecutorService executorService() { |
|||
ThreadPoolTaskExecutor executor = (ThreadPoolTaskExecutor) executor(); |
|||
return executor.getThreadPoolExecutor(); |
|||
} |
|||
|
|||
} |
@ -1,49 +0,0 @@ |
|||
package com.epmet.config; |
|||
|
|||
import com.epmet.properties.ThreadProperties; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.boot.context.properties.EnableConfigurationProperties; |
|||
import org.springframework.context.annotation.Bean; |
|||
import org.springframework.context.annotation.Configuration; |
|||
import org.springframework.scheduling.annotation.EnableAsync; |
|||
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; |
|||
|
|||
import java.util.concurrent.Executor; |
|||
import java.util.concurrent.ExecutorService; |
|||
import java.util.concurrent.ThreadPoolExecutor; |
|||
|
|||
/** |
|||
* 线程池配置类 |
|||
*/ |
|||
@Configuration |
|||
@EnableConfigurationProperties(ThreadProperties.class) |
|||
@EnableAsync |
|||
public class AsyncConfig { |
|||
|
|||
@Autowired |
|||
private ThreadProperties threadProperties; |
|||
|
|||
@Bean |
|||
public Executor executor() { |
|||
ThreadProperties.ThreadPoolProperties threadPoolProps = threadProperties.getThreadPool(); |
|||
|
|||
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); |
|||
executor.setCorePoolSize(threadPoolProps.getCorePoolSize()); |
|||
executor.setMaxPoolSize(threadPoolProps.getMaxPoolSize()); |
|||
executor.setQueueCapacity(threadPoolProps.getQueueCapacity()); |
|||
executor.setThreadNamePrefix("epmet-resi-group-"); |
|||
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
|
|||
// CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行
|
|||
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //对拒绝task的处理策略
|
|||
executor.setKeepAliveSeconds(threadPoolProps.getKeepAlive()); |
|||
executor.initialize(); |
|||
return executor; |
|||
} |
|||
|
|||
@Bean |
|||
public ExecutorService executorService() { |
|||
ThreadPoolTaskExecutor executor = (ThreadPoolTaskExecutor) executor(); |
|||
return executor.getThreadPoolExecutor(); |
|||
} |
|||
|
|||
} |
Loading…
Reference in new issue