java 动态增加应用服务器,出现的消息队列的消费者提报错问题

时间:2024-01-27 16:22:40

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);
        });
    }
}