springboot中多個(gè)消息服務(wù)器連接的配置

平時(shí)開發(fā)消息服務(wù)器只需要一套配置, 如果有多個(gè)消息服務(wù)器就需要自己定義ConnectionFactory, 并在接收消息的處理方法中指定要使用的containerFactory .
話不多扯, 代碼如下:

  1. 在配置文件中配置多個(gè)消息服務(wù)器連接參數(shù), 這里以IBM MQ為例, 其他的同理
qm1.queueManager=QM1
qm1.channel=DEV.APP.SVRCONN
qm1.connName=192.168.2.2(1414)
qm1.user=app
qm1.password=passw0rd
qm1.pool.enabled=true

qm2.queueManager=QM1
qm2.channel=DEV.APP.SVRCONN
qm2.connName=192.168.2.3(1414)
qm2.user=app
qm2.password=passw0rd
qm2.pool.enabled=true
  1. 使用上述信息配置兩個(gè)containerFactory bean:
    Qm1Config
import com.ibm.mq.jms.MQConnectionFactory;
import com.ibm.mq.spring.boot.MQConfigurationProperties;
import com.ibm.mq.spring.boot.MQConnectionFactoryCustomizer;
import com.ibm.mq.spring.boot.MQConnectionFactoryFactory;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;

import javax.jms.ConnectionFactory;
import java.util.List;

@Configuration
public class Qm1Config {
    @Bean
    @ConfigurationProperties("qm1")
    public MQConfigurationProperties qm1ConfigProperties() {
        return new MQConfigurationProperties();
    }

    @Bean
    public MQConnectionFactory qm1ConnectionFactory(@Qualifier("qm1ConfigProperties") MQConfigurationProperties properties, ObjectProvider<List<MQConnectionFactoryCustomizer>> factoryCustomizers) {
        return new MQConnectionFactoryFactory(properties, factoryCustomizers.getIfAvailable()).createConnectionFactory(MQConnectionFactory.class);
    }

    @Bean
    public JmsListenerContainerFactory<?> qm1JmsListenerContainerFactory(@Qualifier("qm1ConnectionFactory") ConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        configurer.configure(factory, connectionFactory);
        return factory;
    }
}

Qm2Config

@Configuration
public class Qm2Config {
    @Bean
    @ConfigurationProperties("qm2")
    public MQConfigurationProperties qm2ConfigProperties() {
        return new MQConfigurationProperties();
    }

    @Bean
    public MQConnectionFactory qm2ConnectionFactory(@Qualifier("qm2ConfigProperties") MQConfigurationProperties properties, ObjectProvider<List<MQConnectionFactoryCustomizer>> factoryCustomizers) {
        return new MQConnectionFactoryFactory(properties, factoryCustomizers.getIfAvailable()).createConnectionFactory(MQConnectionFactory.class);
    }

    @Bean
    public JmsListenerContainerFactory<?> qm2JmsListenerContainerFactory(@Qualifier("qm2ConnectionFactory") ConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        configurer.configure(factory, connectionFactory);
        return factory;
    }
}

這兩個(gè)類差不多, 只是使用的參數(shù)不同

  1. 在消息接收的處理方法上指定不同的containerFactory
@JmsListener(destination = "DEV.QUEUE.1", containerFactory = "qm1JmsListenerContainerFactory")
    public void receiveMsg(Message msg) throws Exception {
        String msgBody = msg.getBody(String.class);
        // 自定義代碼
    }
@JmsListener(destination = "DEV.QUEUE.5", containerFactory = "qm2JmsListenerContainerFactory")
    public void receiveMsg5(Message msg) throws Exception {
        String msgBody = msg.getBody(String.class);
        System.out.println(msgBody);
    }

只需要配置這3處就OK了, 雖然使用的是JMS, 但理解這種方式之后遇到類似問(wèn)題都可以靈活應(yīng)對(duì)了.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容