6.传统Spring中使用RabbitMQ

目录


RabbitMQ专栏目录(点击进入…)



传统Spring中使用RabbitMQ

1.导入依赖

<!-- RabbitMQ中间消息件 -->
<dependency>
	<groupId>org.springframework.amqp</groupId>
	<artifactId>spring-rabbit</artifactId>
	<version>2.2.5.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.springframework.amqp</groupId>
	<artifactId>spring-amqp</artifactId>
	<version>2.2.5.RELEASE</version>
</dependency>
<dependency>
	<groupId>com.rabbitmq</groupId>
	<artifactId>amqp-client</artifactId>
	<version>5.7.3</version>
</dependency>

<!-- 依赖Spring context等等,所以如果使用RabbitMQ,Spring也应该使用对应版本 -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-messaging</artifactId>
	<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-tx</artifactId>
	<version>5.2.4.RELEASE</version>
</dependency>

2.rabbitmq-config.properties配置文件

#主机地址
mq.host=127.0.0.1
#虚拟主机用户名
mq.username=test
#密码
mq.password=123456
#端口号
mq.port=5672
#虚拟主机名
mq.virtualHost=/rabbit
#队列名
mq.queue=rabbitmq_test
#交换机名
mq.exchange=rabbitmq_exchange

3.applicationContext-rabbitmq.xml

<!-- 连接配置 -->
<rabbit:connection-factory id="connectionFactory" host="${mq.host}" username="${mq.username}" password="${mq.password}" port="${mq.port}" virtual-host="${mq.virtualHost}" />
<rabbit:admin connection-factory="connectionFactory" />

<!-- 消息对象json转换类 -->
<bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter" />

<!-- spring AmqpTemplate声明 -->
<rabbit:template exchange="amqpExchange" id="amqpTemplate" connection-factory="connectionFactory" message-converter="jsonMessageConverter" />

<!-- 申明一个消息队列Queue -->
<rabbit:queue id="queue-name" name="${mq.queue}" durable="true" auto-delete="false" exclusive="false" />

<!-- 交换机定义 -->
<!-- rabbit:direct-exchange定义exchange模式为direct,意思就是消息与一个特定的路由键完全匹配,才会转发 -->
<!--  durable	   是否持久化
		exclusive    仅创建者可以使用的私有队列,断开后自动删除
		auto_delete  当所有消费客户端连接断开后,是否自动删除队列
-->
<rabbit:direct-exchange id="mq-exchange" name="${mq.exchange}" durable="true" auto-delete="false">
	<!-- 设置消息queue匹配的key -->
	<rabbit:bindings>
		<rabbit:binding queue="queue_name" key="test_queue_key" />
	</rabbit:bindings>
</rabbit:direct-exchange>

<!-- 监听配置 -->
<rabbit:listener-container connection-factory="connectionFactory" acknowledge="auto">
	<!--	
	queues:监听的队列,多个的话用逗号(,)分隔 
	ref:监听器
	-->
	<rabbit:listener queues="queue-name" ref="queueListenter" />
</rabbit:listener-container>

<bean id="queueListenter" class="com.my.mq.QueueListenter"/>

4.发送消息接口(Producer,生产者)

// 队列生产者
public interface MQProducer {
	// 发送消息到指定队列
	public void sendDataToQueue(String queueKey, Object object);
}

5.发送消息接口实现类

@Service
public class MQProducerImpl implements MQProducer {
	private final static Logger logger = LoggerFactory.getLogger(MQProducerImpl.class);
	@Autowired
	private AmqpTemplate amqpTemplate;

	@Override
	public void sendDataToQueue(String queueKey, Object object) {
		try {
			amqpTemplate.convertAndSend(queueKey, object);
		} catch (Exception e) {
			logger.error(e.toString());
		}
	}
}

convertAndSend:将Java对象转换为消息发送到匹配Key的交换机中Exchange,由于配置了JSON转换,这里是将Java对象转换成JSON字符串的形式

AmqpTemplate
Spring AMQP提供了一个发送和接收消息的操作模板类AmqpTemplate。AmqpTemplate它定义包含了发送和接收消息等的一些基本的操作功能。RabbitTemplate是AmqpTemplate的一个实现。

RabbitTemplate支持消息的确认与返回,为了返回消息,RabbitTemplate需要设置mandatory属性为true,并且CachingConnectionFactory的publisherReturns属性也需要设置为true。返回的消息会根据它注册的RabbitTemplate.ReturnCallback setReturnCallback回调发送到给客户端,一个RabbitTemplate仅能支持一个ReturnCallback

为了确认Confirms消息,CachingConnectionFactory的publisherConfirms属性也需要设置为true,确认的消息会根据它注册的RabbitTemplate.ConfirmCallback setConfirmCallback回调发送到给客户端。一个RabbitTemplate也仅能支持一个ConfirmCallback

6.异步接收消息(消费者,Consumer)

@Component
public class QueueListenter implements MessageListener {
	@Override
	public void onMessage(Message msg) {
		try {
			System.out.print(msg.toString());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

7.测试

@RunWith(value = SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/applicationContext-mq.xml" })
public class TestQueue {
final String queue_key = "test_queue_key";	
	@Autowired
	MQProducer mqProducer;
	
	@Test
	public void send() {
		HashMap<String, Object> hashMap = new HashMap<String, Object>();
		hashMap.put("data", "hello,rabbmitmq!");
		mqProducer.sendDataToQueue(queue_key, hashMap);
	}
}

运行测试程序:Run with JUnit,会发送一条消息到test_queue,监听器监听到消息后,打印出消息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Boot提供了对RabbitMQ的支持,可以使用RabbitMQ作为消息代理来实现应用程序之间的异步通信。以下是在Spring Boot使用RabbitMQ的步骤: 1. 添加依赖 在`pom.xml`添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 2. 配置RabbitMQ连接信息 在`application.properties`添加以下配置信息: ```properties spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest ``` 3. 创建消息队列 使用`@Configuration`注解创建一个配置类,并使用`@Bean`注解创建一个`Queue`对象,如下所示: ```java @Configuration public class RabbitMQConfig { @Bean public Queue myQueue() { return new Queue("myQueue"); } } ``` 4. 发送消息 使用`RabbitTemplate`发送消息,如下所示: ```java @Autowired private RabbitTemplate rabbitTemplate; public void sendMessage(String message) { rabbitTemplate.convertAndSend("myQueue", message); } ``` 5. 接收消息 使用`@RabbitListener`注解创建一个监听方法,如下所示: ```java @RabbitListener(queues = "myQueue") public void receiveMessage(String message) { System.out.println("Received message: " + message); } ``` 现在,当发送消息时,监听方法将自动接收并处理该消息。 以上是在Spring Boot使用RabbitMQ的基本步骤,还有更多高级用法和配置选项可以在官方文档了解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未禾

您的支持是我最宝贵的财富!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值