1. 程式人生 > 實用技巧 >java 動態增加應用伺服器,出現的訊息佇列的消費者提報錯問題

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