springboot配置线程池(spring boot 自定义线程池与使用)
导读:一、进行线程池创建...
一 、进行线程池创建
二 、创建bean操作对象 提供根据beanName获取,手动注入bean等方法,适用于不被spring管理的类中(thread 、callback)
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;
/**
* @author lu_wanli
**/
@Component
public class SpringHelper implements BeanFactoryPostProcessor, ApplicationContextAware {
private static ConfigurableListableBeanFactory beanFactory;
/**
* 获取 Spring Bean工厂
*
* @return beanFactory
*/
public static ConfigurableListableBeanFactory getBeanFactory() {
return beanFactory;
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
SpringHelper.beanFactory = beanFactory;
}
/**
* 获取指定name的bean
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) throws BeansException {
return (T) beanFactory.getBean(name);
}
/**
* 获取指定type的Bean
*/
public static <T> T getBean(Class<T> clz) throws BeansException {
return beanFactory.getBean(clz);
}
/**
* 包含Bean
*
* @param name beanClassName
* @return true/false
*/
public static boolean containsBean(String name) {
return beanFactory.containsBean(name);
}
/**
* 判断以给定名字注册的bean定义是一个singleton还是一个prototype 。 如果与给定名字相应的bean定义没有被找到 ,将会抛出一个异常(NoSuchBeanDefinitionException)
*
* @param name beanName
* @return boolean
*/
public static boolean isSingleton(String name) {
return beanFactory.isSingleton(name);
}
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringHelper.applicationContext = applicationContext;
}
/**
* 动态注入单例bean实例
*
* @param beanName bean名称
* @param singletonObject 单例bean实例
* @return 注入实例
*/
public static Object registerSingletonBean(String beanName, Object singletonObject) {
//将applicationContext转换为ConfigurableApplicationContext
ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) applicationContext;
//获取BeanFactory
DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableApplicationContext.getAutowireCapableBeanFactory();
//动态注册bean.
defaultListableBeanFactory.registerSingleton(beanName, singletonObject);
//获取动态注册的bean.
return configurableApplicationContext.getBean(beanName);
}
}
三 、创建异步线程的管理类
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
/**
* 异步任务管理器
*
*/
public class AsyncManager {
/**
* 异步操作任务调度线程池
*/
private final ThreadPoolTaskExecutor taskExecutor = SpringHelper.getBean("threadPoolTaskExecutor");
/**
* 单例模式
*/
private AsyncManager() {
}
private static final AsyncManager ME = new AsyncManager();
public static AsyncManager me() {
return ME;
}
/**
* 执行任务
*
* @param task 任务
*/
public void execute(Runnable task){
taskExecutor.execute(task);
}
/**
* 停止线程池
*/
public void shutdown() {
taskExecutor.shutdown();
}
}
四 、在项目关闭时关闭相关线程池资源
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.annotation.PreDestroy;
/**
* 关闭线程池资源
*/
@Component
public class ShutDownManager {
private static final Logger logger = LoggerFactory.getLogger(ShutDownManager.class);
@PreDestroy
public void destory() {
shutdownAsyncManager();
}
private void shutdownAsyncManager() {
try {
logger.info("========关闭任务池==========");
AsyncManager.me().shutdown();
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
}
声明:本站所有文章 ,如无特殊说明或标注 ,均为本站原创发布 。任何个人或组织 ,在未征得本站同意时 ,禁止复制 、盗用 、采集 、发布本站内容到任何网站 、书籍等各类媒体平台 。如若本站内容侵犯了原著者的合法权益 ,可联系我们进行处理 。
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!