Module层:
这个类是初始化线程池的一些配置,使spring加载线程池
package com.community.module.asyncExecutor;
/**
* Created by Ni Klaus on 2019/7/10 0010
*/
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
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.ThreadPoolExecutor;
/**
*@ClassName AsyncExecutorConfig
*@Description TODO
*@Author Ni Klaus
*@Date 2019/7/10 0010 下午 15:18
*@Version 1.0
*/
@Configuration
@EnableAsync
public class AsyncExecutorConfig {
private static final Logger logger = LoggerFactory.getLogger(AsyncExecutorConfig.class);
@Value("${async.executor.thread.core_pool_size:5}")
private int corePoolSize;
@Value("${async.executor.thread.max_pool_size:10}")
private int maxPoolSize;
@Value("${async.executor.thread.queue_capacity:99999}")
private int queueCapacity;
@Value("${async.executor.thread.name.prefix:async-service-}")
private String namePrefix;
@Bean(name = "asyncServiceExecutor")
public Executor asyncServiceExecutor() {
logger.info("start asyncServiceExecutor");
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//配置核心线程数
executor.setCorePoolSize(corePoolSize);
//配置最大线程数
executor.setMaxPoolSize(maxPoolSize);
//配置队列大小
executor.setQueueCapacity(queueCapacity);
//配置线程池中的线程的名称前缀
executor.setThreadNamePrefix(namePrefix);
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//执行初始化
executor.initialize();
return executor;
}
}
application.properties 配置文件:
# --------------------异步线程配置 start--------------------
# 配置核心线程数
async.executor.thread.core_pool_size = 5
# 配置最大线程数
async.executor.thread.max_pool_size = 10
# 配置队列大小
async.executor.thread.queue_capacity = 99999
# 配置线程池中的线程的名称前缀
async.executor.thread.name.prefix = async-api-
# --------------------异步线程配置 end--------------------
Service层:
接口:
package com.community.service.asyncExecutor;
/**
* @Author Ni Klaus
* @Description //TODO 异步线程池 接口
* @Date 下午 15:42 2019/7/10 0010
* @Param
* @return
**/
public interface AsyncService{
/**
* 执行异步任务
* 可以根据需求,自己加参数拟定,我这里就做个测试演示
*/
void executeAsync();
}
具体业务需要使用多线程的实现类:
package com.community.service.netty;
/**
* Created by Ni Klaus on 2019/7/10 0010
*/
import com.community.service.asyncExecutor.AsyncService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.net.InetSocketAddress;
/**
*@ClassName StartNettyAsyncServiceImpl
*@Description TODO 用线程池里的异步线程启动做一些业务逻辑
*@Author Ni Klaus
*@Date 2019/7/10 0010 下午 15:42
*@Version 1.0
*/
@Service("StartNettyAsyncService")
public class StartNettyAsyncServiceImpl implements AsyncService {
@Override
@Async("asyncServiceExecutor")
public void executeAsync() {
//业务逻辑处理(启动netty server)
}
}
Controller层调用:
@Resource(name="StartNettyAsyncService")
private AsyncService StartNettyAsyncServiceImpl;