springboot链接两个ActiveMq(多个)
1.修改yml文件
建议:最好把原来的配置去了 。
spring:
# activemq:
# broker-url: tcp://127.0.0.1:61616
# user: admin
# password: admin
# jms:
#true:topic模式,false:queue模式
# pub-sub-domain: true
activemq:
one:
brokerUrl: tcp://127.0.0.1:61616
user: admin
password: admin
#true:topic模式,false:queue模式
pub-sub-domain: true
two:
brokerUrl: tcp://127.0.0.2:61616
user: admin
password: admin
#true:topic模式,false:queue模式
pub-sub-domain: true
#接收不同mq时用到
msgListener:
oneMqName: one
twoMqName: two
2.关键 添加配置类
package com.wys.config;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.core.JmsTemplate;
/**
* @program: service
* @description activemq 配置类
* @author: wys
* @create: 2020-06-03
**/
@Configuration
public class ActiveMqConfigs {
/**
* one mq 地址 账户密码注入
* @param brokerUrl
* @param username
* @param password
* @return
*/
@Bean(name = "oneConnectionFactory")
@Primary
public ActiveMQConnectionFactory oneConnectionFactory(
@Value("${activemq.one.brokerUrl}") String brokerUrl,
@Value("${activemq.one.user}") String username,
@Value("${activemq.one.password}") String password) {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();
factory.setBrokerURL(brokerUrl);
factory.setUserName(username);
factory.setPassword(password);
return factory;
}
/**
* one JmsTemplate生成
* @param connectionFactory
* @param pubSubDmain
* @return
*/
@Bean(name = "oneJmsTemplate")
@Primary
public JmsTemplate oneJmsTemplate(
@Qualifier("oneConnectionFactory") ActiveMQConnectionFactory connectionFactory,
@Value("${activemq.one.pub-sub-domain}") boolean pubSubDmain) {
JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
jmsTemplate.setPubSubDomain(pubSubDmain);
return jmsTemplate;
}
/**
* one JmsListener工厂生成
* @param connectionFactory
* @param pubSubDmain
* @return
*/
@Bean(name = "oneJmsListenerContainerFactory")
@Primary
public JmsListenerContainerFactory oneJmsListenerContainerFactory(
@Qualifier("oneConnectionFactory") ActiveMQConnectionFactory connectionFactory,
@Value("${activemq.one.pub-sub-domain}") boolean pubSubDmain) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setPubSubDomain(pubSubDmain);
return factory;
}
/**
* two mq 地址 账号密码注入
* @param brokerUrl
* @param username
* @param password
* @return
*/
@Bean(name = "twoConnectionFactory")
public ActiveMQConnectionFactory twoConnectionFactory(
@Value("${activemq.two.brokerUrl}") String brokerUrl,
@Value("${activemq.two.user}") String username,
@Value("${activemq.two.password}") String password) {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();
factory.setBrokerURL(brokerUrl);
factory.setUserName(username);
factory.setPassword(password);
return factory;
}
/**
* two JmsTemplate生成
* @param connectionFactory
* @param pubSubDmain
* @return
*/
@Bean(name = "twoJmsTemplate")
public JmsTemplate twoJmsTemplate(
@Qualifier("twoConnectionFactory") ActiveMQConnectionFactory connectionFactory,
@Value("${activemq.two.pub-sub-domain}") boolean pubSubDmain) {
JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
jmsTemplate.setPubSubDomain(pubSubDmain);
return jmsTemplate;
}
/**
* two JmsListener工厂生成
* @param connectionFactory
* @param pubSubDmain
* @return
*/
@Bean(name = "twoJmsListenerContainerFactory")
public JmsListenerContainerFactory twoJmsListenerContainerFactory(
@Qualifier("twoConnectionFactory") ActiveMQConnectionFactory connectionFactory,
@Value("${activemq.two.pub-sub-domain}") boolean pubSubDmain) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setPubSubDomain(pubSubDmain);
return factory;
}
}
3.调用JmsTemplate发送mq
只要在注入对象前加@Qualifier注解就可以了,当然也可以用 @Resource注解。
jmsTemplate.convertAndSend方法的第一个参数是要发送的mq名称,第二个参数是mq的内容。
private Logger log = LoggerFactory.getLogger(this.getClass());
@Autowired
@Qualifier("oneJmsTemplate")//或twoJmsTemplate
private JmsTemplate jmsTemplate;
/**
* 查询发送测试
*
*/
public void sendMq() {
try {
jmsTemplate.convertAndSend("mqName","content");
} catch (Exception e) {
log.error("SendMsgController.sendMq()", e);
}
}
4. 接收mq -@JmsListener注解添加containerFactory配置
/**
* 接收one mq方法
*
* @param message
*/
@JmsListener(destination = "${msgListener.oneMqName}" ,containerFactory = "oneJmsListenerContainerFactory")
public void receiveQueueOne(String message) {
if (StringUtils.isEmpty(message)) {
return;
}
// todo
}
/**
* 接收two mq方法
*
* @param message
*/
@JmsListener(destination = "${msgListener.twoMqName}" ,containerFactory = "twoJmsListenerContainerFactory")
public void receiveQueueTwo(String message) {
if (StringUtils.isEmpty(message)) {
return;
}
// todo
}
如果接收相同ip相同queues或topics的队列,就不用增加配置,直接调用即可. 如和one的ip相同,直接复制receiveQueueOne方法,修改方法名和注解上的destination配置即可,containerFactory配置不用修改。