springboot集成activemq实现消息的发布和订阅,首先导包:
<!-- activemq消息队列通讯-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>5.1.3.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client</artifactId>
</dependency>
<!-- 使用mq连接池导入此包,只适用于springboot2.1+ -->
<dependency>
<groupId>org.messaginghub</groupId>
<artifactId>pooled-jms</artifactId>
</dependency>
这里注意一下,如果你的springboot版本是2.1以下的,在使用连接池的时候导入这个包:
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.7.0</version>
</dependency>
配置文件:
# Spring配置
spring:
# ma消息队列
activemq:
broker-url: tcp://localhost:61616
user: admin
password: admin
pool:
#开启连接池
enabled: true
max-connections: 50
#如果要发送和接收topic消息,加入这个
jms:
pub-sub-domain: true
然后在要发送消息的地方加入:
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
//这里是发送消息代码,queue为主题或队列名称,msgString是消息内容
jmsMessagingTemplate.convertAndSend(queue,msgString);
可以写一个controller测试一下:
@Controller
public class P2PProducer {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@RequestMapping("/producer")
@ResponseBody
public void send() {
String msgString = System.currentTimeMillis()+" ";
Queue queue = new ActiveMQQueue(“test-queue”);
jmsMessagingTemplate.convertAndSend(queue,msgString);
System.out.println("点对点通讯,msg"+msgString);
}
}
用postman测试一下
然后在http://localhost:8161/admin/queues.jsp可以看到:
在队列里面有了一个未消费的数据。
发送主题和发送队列代码一样,只不过是发送队列时创建队列,发送主题时创建主题:
@Controller
public class P2PProducer {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@RequestMapping("/producer")
@ResponseBody
public void send() {
String msgString = System.currentTimeMillis()+" ";
//这里创建一个主题
Topic topic = new ActiveMQTopic("主题名称");
jmsMessagingTemplate.convertAndSend(topic ,msgString);
System.out.println("点对点通讯,msg"+msgString);
}
}
在http://localhost:8161/admin/topics.jsp可以看到发送的主题消息。
同时接收队列和主题发送的消息:
首先写一个jms的配置类
@Configuration
public class JmsConfig {
// topic模式的ListenerContainer
@Bean
public JmsListenerContainerFactory<?> jmsListenerContainerTopic(ConnectionFactory activeMQConnectionFactory) {
DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();
bean.setPubSubDomain(true);
bean.setConnectionFactory(activeMQConnectionFactory);
return bean;
}
// queue模式的ListenerContainer
@Bean
public JmsListenerContainerFactory<?> jmsListenerContainerQueue(ConnectionFactory activeMQConnectionFactory) {
DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();
bean.setConnectionFactory(activeMQConnectionFactory);
return bean;
}
}
然后是接收消息的代码
@Component
public class DiningListener {
// @JmsListener(destination = "队列名称",containerFactory = "jmsListenerContainerQueue")
// public void listenerQueue(String msg){
// System.out.println("queue你消费了:" + msg);
// }
// @JmsListener(destination = "主题名称",containerFactory = "jmsListenerContainerTopic")
// public void listenerTopic(String msg){
// //byte数组转字符串
String str= new String (msg);
// System.out.println("topic你消费了:" + msg);
// }
}
如果发送的消息类型为byte数组时,这个两个监听方法里的参数也设置byte数组类型接收,然后在转成String即可。
@JmsListener注解中containerFactory 的属性各自对应jms配置类里的bean。
项目启动之后可以启动postman进行测试或者直接写一个测试类进行测试一下。