spring boot操作activemq队列及主题示例

本文详细介绍如何在Spring Boot中集成ActiveMQ实现消息队列功能,包括搭建消息代理服务器、配置Producer与Consumer、实现消息的发送与接收等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工作过程:


1. 搭建消息代理服务器

在linux虚拟机上安装activemq,

2. 新建spring boot项目,作为producer

(1)配置JMS连接工厂ConnectionFactory,让它知道如何连接到ActiveMQ。ActiveMQConnection是ActiveMQ自带的连接工厂。

@Bean
public ConnectionFactory connectionFactory(){
	ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("admin", "admin", "tcp://192.168.211.106:61616");
	return factory;
}

2)配置需要消息传递的目的地。目的地可以是一个队列queue,也可以是一个主题topic。

@Bean
public Queue queue() {
	return new ActiveMQQueue(queueName);
}

@Bean
public Topic topic(){
	return new ActiveMQTopic(topicName);
}

(3)使用JmsTemplate编写一个定时发送程序,配置JmsTemplate,并设置MessageConverter

@Bean // Serialize message content to json using TextMessage
public MessageConverter jacksonJmsMessageConverter() {
	MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
	converter.setTargetType(MessageType.TEXT);
	converter.setTypeIdPropertyName("_type");
	return converter;
}

一个jmsTemplate可以同时支持queue和topic的消息发送,只需要指定不同的destination即可

(4)调用jmsTemplate.convertAndSend来发送Email对象,这里使用了@Schedule循环发送Email给queue和topic

3. 新建springboot项目,作为consumer

创建消息驱动的POJO接收消息

(1)仍要配置JMS连接工厂ConnectionFactory

(2)配置Topic模式消息监听器。对Topic模式配置JmsListenreContainerFactory,设置好ConnectionFactory及MessageConverter,并且还要调用setPubSubDomain

@Bean
public JmsListenerContainerFactory<?> jmsListenerContainerTopic(ConnectionFactory connectionFactory) {
	DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
	// This provides all boot's default to this factory, including the message converter
	factory.setConnectionFactory(connectionFactory);
	factory.setPubSubDomain(true);
	factory.setMessageConverter(jacksonJmsMessageConverter());
	// You could still override some of Boot's default if necessary.
	return factory;
}

(3)配置Queue模式消息监听器。对Queue模式配置JmsListenreContainerFactory,设置好ConnectionFactory及MessageConverter

@Bean
public JmsListenerContainerFactory<?> jmsListenerContainerTopic(ConnectionFactory connectionFactory) {
	DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
	// This provides all boot's default to this factory, including the message converter
	factory.setConnectionFactory(connectionFactory);
	factory.setMessageConverter(jacksonJmsMessageConverter());
	// You could still override some of Boot's default if necessary.
	return factory;
}

(4)在方法上使用注解@JmsListener来接收消息,其需要配置监听的目的地及listenerContainer

Activemq的效果:

Queue模式:


Topic模式:


结果:

应该先启动两个consumer之后,再启动producer

生产者:


消费者1:


消费者2:


源代码

生产者源码:https://gitee.com/constfafa/activemq-producer

消费者1源码:https://gitee.com/constfafa/activemq-consumer

消费者2源码:https://gitee.com/constfafa/activemq-consumer2

参考

官方参考:Messaging with JMS

这段代码是一个 ActiveMQ 消息队列的生产者的实现类,实现了一个 MqProducer 接口,其中 MqProducer 是一个消息队列生产者的接口。 1. @Component 这是一个 Spring Framework 的注解,被注解的类会被 Spring 自动扫描并创建实例,使其可以被 Spring 容器所管理。 2. public class ActiveMQProducer implements MqProducer 声明一个名为 ActiveMQProducer 的类,实现了 MqProducer 接口。 3. @Override 这是一个标识性注解,用于标识该方法是重写父类或接口中的方法。 4. public void sendDelayMessage(String queue, Serializable data, long millis) 声明了一个名为 sendDelayMessage 的方法,该方法实现了 MqProducer 接口中的 sendDelayMessage 方法。它有三个参数:queue 表示消息队列的名称,data 表示要发送的消息数据,millis 表示消息发送的延迟时间。 5. JmsTemplate template = ApplicationUtil.getBean(JmsTemplate.class); 使用 ApplicationUtil 工具类获取一个 JmsTemplate 实例,JmsTemplateSpring Framework 提供的用于发送和接收 JMS 消息的核心类。 6. template.send(queue, session -> { 使用获取到的 JmsTemplate 实例发送消息,其中 queue 表示要发送的消息队列名称,session -> {} 表示一个回调函数,用于创建消息。 7. Message msg = session.createObjectMessage(data); 使用 session 创建一个 ObjectMessage 消息,并将 data 作为其中的消息数据。 8. msg.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, millis); 设置消息的延迟发送时间,使用了 ActiveMQ 提供的 ScheduledMessage.AMQ_SCHEDULED_DELAY 属性。 9. msg.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, 1000); 设置消息发送的周期,使用了 ActiveMQ 提供的 ScheduledMessage.AMQ_SCHEDULED_PERIOD 属性。 10. msg.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, 1); 设置消息发送的重复次数,使用了 ActiveMQ 提供的 ScheduledMessage.AMQ_SCHEDULED_REPEAT 属性。 11. return msg; 返回创建好的消息。 12. public void sendMessage(String queue, Serializable data) 声明了一个名为 sendMessage 的方法,该方法实现了 MqProducer 接口中的 sendMessage 方法。它有两个参数:queue 表示消息队列的名称,data 表示要发送的消息数据。 13. JmsMessagingTemplate template = ApplicationUtil.getBean(JmsMessagingTemplate.class); 使用 ApplicationUtil 工具类获取一个 JmsMessagingTemplate 实例,JmsMessagingTemplate 是 Spring Framework 提供的用于发送和接收 JMS 消息的高级类。 14. template.convertAndSend(queue, data); 使用获取到的 JmsMessagingTemplate 实例发送消息,并将 data 作为其中的消息数据。 15. public void sendDelayMessage(String queue, long millis) 声明了一个名为 sendDelayMessage 的方法,该方法实现了 MqProducer 接口中的 sendDelayMessage 方法。它有两个参数:queue 表示消息队列的名称,millis 表示消息发送的延迟时间。 16. JmsTemplate template = ApplicationUtil.getBean(JmsTemplate.class); 使用 ApplicationUtil 工具类获取一个 JmsTemplate 实例。 17. template.send(queue, session -> { 使用获取到的 JmsTemplate 实例发送消息,其中 queue 表示要发送的消息队列名称,session -> {} 表示一个回调函数,用于创建消息。 18. Message msg = session.createTextMessage(); 使用 session 创建一个 TextMessage 消息。 19. msg.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, millis); 设置消息的延迟发送时间。 20. msg.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, 1000); 设置消息发送的周期。 21. msg.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, 1); 设置消息发送的重复次数。 22. return msg; 返回创建好的消息。 23. public void sendMessage(String queue) 声明了一个名为 sendMessage 的方法,该方法实现了 MqProducer 接口中的 sendMessage 方法。它有一个参数:queue 表示消息队列的名称。 24. JmsTemplate template = ApplicationUtil.getBean(JmsTemplate.class); 使用 ApplicationUtil 工具类获取一个 JmsTemplate 实例。 25. template.send(queue, Session::createTextMessage); 使用获取到的 JmsTemplate 实例发送消息,并使用 Session::createTextMessage 方法创建消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值