springboot中多个消息服务器连接的配置

平时开发消息服务器只需要一套配置, 如果有多个消息服务器就需要自己定义ConnectionFactory, 并在接收消息的处理方法中指定要使用的containerFactory .
话不多扯, 代码如下:

  1. 在配置文件中配置多个消息服务器连接参数, 这里以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. 使用上述信息配置两个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> 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> 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;
    }
}

这两个类差不多, 只是使用的参数不同

  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, 但理解这种方式之后遇到类似问题都可以灵活应对了.

你可能感兴趣的:(springboot中多个消息服务器连接的配置)