概述
服务器系统:Ubuntu18.04
服务器安装ActiveMQ版本:apache-activemq-5.16.5
SpringBoot版本:2.6.3
SpringBoot集成ActiveMQ
1、pom.xml添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
</dependency>
2、启动类添加注解 @EnableJms
3、yml配置
server:
port: 8081
spring:
activemq:
broker-url: tcp://127.0.0.1:61616
user: admin
password: admin
queue-name: queue-test01 #队列名称
topic-name: topic-test01 #主题名称
jms:
pub-sub-domain: true # 默认为false,点对点模式queue true订阅模式topic
pool:
enabled: true
注意事项:
pub-sub-domain: true
如果设置为false,那么消费的时候,只能消费queue
如果设置为true,那么消费的时候,只能消费topic
以上说法只能消费queue或者只能消费topic是针对消费者,注解@JmsListener只设置destination参数不设置containerFactory参数,如果设置了containerFactory这个参数,对于是设置true还是false就无所谓了,可以不用设置这个参数了就。
这时候需要进行如下配置,注意和上面的区别,多了对于containerFactory的配置,这个是在消费者的时候会用到。
//MQ配置信息
@Configuration
public class MQConfig {
@Value("${spring.activemq.broker-url}")
private String brokerUrl;
@Value("${spring.activemq.user}")
private String username;
@Value("${spring.activemq.password}")
private String password;
//队列名称
@Value("${spring.activemq.queue-name}")
private String queueName;
//主题名称
@Value("${spring.activemq.topic-name}")
private String topicName;
//队列Bean对象
@Bean(name = "queue")
public Queue queue() {
return new ActiveMQQueue(queueName);
}
//主题Bean对象
@Bean(name = "topic")
public Topic topic() {
return new ActiveMQTopic(topicName);
}
@Bean
public ConnectionFactory connectionFactory(){
return new ActiveMQConnectionFactory(username, password, brokerUrl);
}
//队列模式
@Bean("queueListener")
public JmsListenerContainerFactory<?> queueJmsListenerContainerFactory(ConnectionFactory connectionFactory){
SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setPubSubDomain(false);
return factory;
}
//主题模式
@Bean("topicListener")
public JmsListenerContainerFactory<?> topicJmsListenerContainerFactory(ConnectionFactory connectionFactory){
SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setPubSubDomain(true);
return factory;
}
}
这里有个问题,我还没搞明白,如果自定义设置了ConnectionFactory,如果ActiveMQ断开重启的时候,会报错,不会自动重连 (哭~),应该是需要在创建ConnectionFactory有什么设置,我还没找到,如果不用配置这个,默认是会自动重连的。这一点一定要注意,所以建议没搞懂之前下先别自定义设置ConnectionFactory了。
4、我的MQ配置
//MQ配置信息
@Configuration
public class MQConfig {
//队列名称
@Value("${spring.activemq.queue-name}")
private String queueName;
//主题名称
@Value("${spring.activemq.topic-name}")
private String topicName;
//创建消息队列Bean对象
@Bean(name = "queue")
public Queue queue() {
return new ActiveMQQueue(queueName);
}
//创建消息主题Bean对象
@Bean(name = "topic")
public Topic topic() {
return new ActiveMQTopic(topicName);
}
}
5、我的生产者
//我的生产者
@Service
public class MyProducer {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
//这个是在MQConfig配置中的队列Bean对象
@Autowired
private Queue queue;
//这个是在MQConfig配置中的主题Bean对象
@Autowired
private Topic topic;
//发送队列
public void sendQueue(String msg){
this.sendMessage(this.queue,msg);
}
//发送主题
public void sendTopic(String msg){
this.sendMessage(this.topic,msg);
}
//发送消息,destination是发送到的队列,message是待发送的消息
private void sendMessage(Destination destination, final String message){
jmsMessagingTemplate.convertAndSend(destination,message);
}
}
6、我的消费者
//我的消费者
@Service
public class MyConsumer {
//queue模式的消费者
@JmsListener(destination = "${spring.activemq.queue-name}")
public void recvMsg_Queue(String message){
System.out.println("queue接收到:" + message);
}
//topic模式的消费者
@JmsListener(destination = "${spring.activemq.topic-name}")
public void recvMsg_Topic(String message){
System.out.println("topic接收到:" + message);
}
}
上面只能对一种模式进行消费,要么是queue要么是topic,但是如果想同时既能消费queue又能消费topic,那么就需要再配置的时候对containerFactory参数进行配置了,如下:
//我的消费者
@Service
public class MyConsumer {
//queue模式的消费者
@JmsListener(destination = "${spring.activemq.queue-name}",containerFactory = "queueListener")
//@JmsListener(destination = "${spring.activemq.queue-name}")
public void recvMsg_Queue(String message){
System.out.println("queue接收到:" + message);
}
//topic模式的消费者
@JmsListener(destination = "${spring.activemq.topic-name}",containerFactory = "topicListener")
//@JmsListener(destination = "${spring.activemq.topic-name}")
public void recvMsg_Topic(String message){
System.out.println("topic接收到:" + message);
}
}
7、测试
//我的控制器
@RestController
public class MyController {
@Autowired
private MyProducer myProducer;
@RequestMapping("/testQueue")
public String sendQueue(String msg){
myProducer.sendQueue(msg);
return "queue success";
}
@RequestMapping("/testTopic")
public String sendTopic(String msg){
myProducer.sendTopic(msg);
return "topic success";
}
}