平時(shí)開發(fā)消息服務(wù)器只需要一套配置, 如果有多個(gè)消息服務(wù)器就需要自己定義ConnectionFactory, 并在接收消息的處理方法中指定要使用的containerFactory .
話不多扯, 代碼如下:
- 在配置文件中配置多個(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
- 使用上述信息配置兩個(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ù)不同
- 在消息接收的處理方法上指定不同的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ì)了.