有一些项目依赖的数据,需要项目启动的同时加载到应用程序中,这也是造成项目启动慢的一个很重要的原因。
那么经过分析以后,能够确认某些数据是可以后续加载的,此时可以异步加载的方法。
下面来介绍。
第一步,打印Bean加载的时间,观察那些Bean加载的慢。
// BeanInitCostTimeBeanPostProcessor.java
public class BeanInitCostTimeBeanPostProcessor implements BeanPostProcessor {
private static final ConcurrentHashMap<String, Long> START_TIME = new ConcurrentHashMap<>();
public Object postProcessBeforeInitialization(Object bean, String beanName) {
START_TIME.put(beanName, System.currentTimeMillis());
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName) {
if(Objects.nonNull(START_TIME.get(beanName))) {
log.info("beanName:{}, cost:{}", beanName, System.currentTimeMillis() - START_TIME.get(beanName));
}
return bean;
}
}
// SleepBean.java
public class SleepBean {
"initWithSleep") (initMethod =
public TestBean testLongTimeBean() {
return new TestBean();
}
public static class TestBean {
public void initWithSleep() throws InterruptedException {
Thread.sleep(10000);
}
}
}
执行效果如图:
加载都是毫秒级的,累计起来就很多了。
另外,如果要加载业务数据,一系列处理的话,时间会很长,影响项目启动。
第二步,加入异步方法,延迟加载业务bean
// AsyncTestLongTimeBean.java
4j
public class AsyncTestLongTimeBean extends SleepBean.TestBean implements FactoryBean<TestBean> {
private AtomicBoolean started = new AtomicBoolean(false);
public TestBean getObject() throws Exception {
return this;
}
public Class> getObjectType() {
return SleepBean.TestBean.class;
}
public void initWithSleep() {
long start = System.currentTimeMillis();
new Thread(() -> {
try {
super.initWithSleep();
} catch (InterruptedException e) {
}
// 保持操作的原子性
started.compareAndSet(false, true);
log.info("async bean init cost:{} ms", System.currentTimeMillis() - start);
}).start();
}
}
// SleepBean.java 修改
public class SleepBean {
"initWithSleep") (initMethod =
public TestBean testLongTimeBean() {
return new AsyncTestLongTimeBean();
}
public static class TestBean {
public void initWithSleep() throws InterruptedException {
Thread.sleep(10000);
}
}
}
效果很明显,它不影响项目启动了。
这个用户还是很大,很多业务数据,可以搞成异步初始化,不影响项目启动,还可以让项目运行时,速度快。
阅读全文
下载说明:
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.shuli.cc/?p=14723,转载请注明出处。
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.shuli.cc/?p=14723,转载请注明出处。
评论0