java 動態增加應用伺服器,出現的訊息佇列的消費者提報錯問題
阿新 • • 發佈:2020-11-05
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); }); } }