java 动态增加应用服务器,出现的消息队列的消费者提报错问题
在项目中,有这样的业务场景,在某一个时间段,客户流量瞬间增大,服务器瞬间很大,出现高并发问题。有一种解决方案就是脚本动态增加业务服务器,来缓解系统瞬间达到的流量。
但是在现实中,会出现一个问题,就是在动态增加应用服务器的时候,会报错:很多空指针。初步确定的原因是:
在服务器启动的环节,加载bean的时候,先加载了mq的消费者的bean,并且开始了消费者接受消息订阅。但是这个时候applicationContext都还没有加载,导致在消费者接受消息,到各个业务方法中时,调用很多对象就报空指针了。
所以想得办法就是在项目启动完成后,在初始化有关mq的bean.直接贴上代码:
@Component @Slf4j public class RocketConsumerInit implements ApplicationListener<ContextRefreshedEvent> { private static final String CONSUMER_BEAN_NAME_SUFFIX = "Consumer"; private static final String PRODUCER_BEAN_NAME_SUFFIX = "Producer"; @Override public void onApplicationEvent(ContextRefreshedEvent event) { final ApplicationContext app = event.getApplicationContext(); DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) app.getAutowireCapableBeanFactory(); Arrays.stream(defaultListableBeanFactory.getBeanDefinitionNames()).filter(beanName -> beanName.endsWith(CONSUMER_BEAN_NAME_SUFFIX) || beanName.endsWith(PRODUCER_BEAN_NAME_SUFFIX)).forEach(beanName -> { System.out.println("bean_name = " + beanName); defaultListableBeanFactory.getBean(beanName); }); } }