平时开发消息服务器只需要一套配置, 如果有多个消息服务器就需要自己定义ConnectionFactory, 并在接收消息的处理方法中指定要使用的containerFactory .
话不多扯, 代码如下:
- 在配置文件中配置多个消息服务器连接参数, 这里以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
- 使用上述信息配置两个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;
}
}
这两个类差不多, 只是使用的参数不同
- 在消息接收的处理方法上指定不同的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, 但理解这种方式之后遇到类似问题都可以灵活应对了.
网友评论