创建前
public class TimerWebContextListener extends ContextLoaderListener{
private static Logger logger = LoggerFactory.getLogger(WebContextListener.class);
@Override
public WebApplicationContext initWebApplicationContext(
ServletContext servletContext) {
try {
initProperties(servletContext);
/* logger.info("\r\n==========================线程组初始化开始===============================\r\n");
//spring容器
WebApplicationContext webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
//获取Spirng初始化的Workers
List<ThreadConfigBean> workers = (List<ThreadConfigBean>) webApplicationContext.getBean("workers");
logger.info("\r\n==========================线程组初始化完毕===============================\r\n");
logger.info("\r\n==========================监控线程初始化开始===============================\r\n");
ThreadGroupUtils.monitorThreadStart(group, 2000L);
logger.info("\r\n==========================监控线程初始化完毕===============================\r\n");
*/
} catch (Exception e) {
logger.error("加载配置文件失败......" + e);
}
if (!printKeyLoadMessage()) {
return null;
}
return super.initWebApplicationContext(servletContext);
}
创建后
public class TimerApplicationContextListener implements ApplicationListener<ContextRefreshedEvent>{
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
if (event.getApplicationContext().getParent() == null) {// root
logger.info("*******************************");
logger.info("============spring 初始化完成===========");
logger.info("*******************************");
WebApplicationContext webApplicationContext = (WebApplicationContext) event.getApplicationContext();
logger.info("\r\n==========================线程组初始化开始===============================\r\n");
//获取Spirng初始化的Workers
List<ThreadConfigBean> workers = (List<ThreadConfigBean>) webApplicationContext.getBean("workers");
SecurityManager manager = System.getSecurityManager();
ThreadGroup parent = (manager!= null) ? manager.getThreadGroup() : Thread.currentThread().getThreadGroup();
ThreadGroup group = new ThreadGroup(parent, "root-threadgroup");
//根据配置的bean初始化每个业务的线程池
for(ThreadConfigBean tc : workers){
//使用有界队列 设置大小
ArrayBlockingQueue<Runnable> taskQueue = new ArrayBlockingQueue<Runnable>(tc.getQueueCapacity());
//线程工厂创建
ThreadFactory threadFactory = new ThreadFactoryWithBusiName(new ThreadGroup(group, tc.getBusiName()), tc.getBusiName());
ThreadPoolExecutorWithBusiName threadPoolExecutorWithBusiName =
new ThreadPoolExecutorWithBusiName(tc.getBusiName(), tc.getMin(), tc.getMax(), tc.getKeepAliveTime(), TimeUnit.SECONDS, taskQueue, threadFactory, tc.getRejectHandler());
ThreadGroupUtils.addThreadWorker(tc.getBusiName(), threadPoolExecutorWithBusiName);
}
logger.info("\r\n==========================线程组初始化完毕===============================\r\n");
logger.info("\r\n==========================监控线程初始化开始===============================\r\n");
ThreadGroupUtils.monitorThreadStart(group, 4000L);
logger.info("\r\n==========================监控线程初始化完毕===============================\r\n");
}
}
注意:如果想在ApplicationListener的实现类中引用初始化完成的bean
需要将这个实现类交给spring管理才能autowire。
此时都可以出去autowire的bean,所有的bean都已经被如期加载
两种方式
@Component
<bean id="" class=""/>
自选