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


    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);
            });
        }
    }
  • 相关阅读:
    纸牌博弈问题
    Eureka Server 实现在线扩容
    设计模式学习(二):单例模式
    最大的观影时间问题
    拼凑硬币问题
    泡咖啡问题
    设计模式学习(五):原型模式
    最长公共子序列问题
    设计模式学习(六):代理模式
    经典背包系列问题
  • 原文地址:https://www.cnblogs.com/zhaowei520/p/13932542.html
Copyright © 2020-2023  润新知