文章目录
- RabbitMQ项目实战
- 选择客户端
- 基础实战
前情提要:我们了解了消息队列,RabbitMQ的入门,交换机,以及核心特性等知识,现在终于来到了激动人心的项目实战环节!本小节主要介绍通过Spring Boot RabbitMQ Starter 在SpringBoot项目中跑通测试RabbitMQ,话不多说,我们马上开始!
RabbitMQ项目实战
选择客户端
怎么在项目中使用RabbitMQ?
- 使用官方的客户端(类比jdbc)
优点:兼容性好,换语言成本低,比较灵活
缺点:太灵活,要自己去处理一些事情,比如要自己维护管理链接,很麻烦
- 使用封装好的客户端,比如Spring Boot RabbitMQ Starter(类比mybatis)
优点:简单易用,直接配置直接用,更方便地去管理链接
缺点:不够灵活,被框架限制
基础实战
我们使用Spring Boot RabbitMQ Starter
https://spring.io/guides/gs/messaging-rabbitmq/
- 引入依赖
注意:使用的版本一定要和你的springboot版本一致,去maven中心仓库中找版本一致的
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId><version>2.7.2</version>
</dependency>
2) 在yml中引入配置
spring:rabbitmq:host: localhostport: 5672password: guestusername: guest
3)创建交换机和队列,一般在项目启动之前执行创建一次即可
package com.yupi.springbootinit.bimq;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;/*** 用于创建测试程序用到的交换机和队列(只用在程序启动前执行一次)*/
public class MqInitMain {public static void main(String[] args) {try{ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");Connection connection = factory.newConnection();Channel channel = connection.createChannel();String EXCHANGE_NAME = "code_exchange";channel.exchangeDeclare(EXCHANGE_NAME,"direct");String queueName = "code_queue";channel.queueDeclare(queueName,true,false,false,null);channel.queueBind(queueName,EXCHANGE_NAME,"my_routingKey");}catch (Exception e){}}
}
4)生产者代码
package com.yupi.springbootinit.bimq;import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;import javax.annotation.Resource;@Component
public class MyMessageProducer {@Resourceprivate RabbitTemplate rabbitTemplate;public void sendMessage(String exchange,String routingKey,String message){rabbitTemplate.convertAndSend(exchange,routingKey,message);}
}
5)消费者代码
package com.yupi.springbootinit.bimq;import com.rabbitmq.client.Channel;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;@Component
@Slf4j
public class MyMessageConsumer {//使用@SneakyThrows注解简化异常处理//使得你可以在不声明抛出异常的方法中抛出受检异常,而无需捕获它们。这在一些特定情况下可能会很有用,但通常不建议频繁使用,因为它可能会破坏代码的可读性和健壮性。@SneakyThrows//使用@RabbitListener注解指定要监听的队列名称为"code_queue",并设置消息的确认机制为手动确认@RabbitListener(queues = {"code_queue"},ackMode = "MUNAL")// // 在RabbitMQ中,每条消息都会被分配一个唯一的投递标签,用于标识该消息在通道中的投递状态和顺序。通过使用@Header(AmqpHeaders.DELIVERY_TAG)注解,可以从消息头中提取出该投递标签,并将其赋值给long deliveryTag参数。public void reciveMessage(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliverttag){log.info("receiveMessage message = {}", message);//手动确认消息的接收channel.basicAck(deliverttag,false);}
}
测试类测试
package com.yupi.springbootinit.bimq;import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class MyMessageProducerTest {@Resourceprivate MyMessageProducer myMessageProducer;@Testvoid sendMessage() {myMessageProducer.sendMessage("code_exchange", "my_routingKey", "你好呀");}
}
打印出了日志,说明消费者收到了消息,测试通过!
既然测试已经通过,接下来那就把它运用到项目中去吧!欲知后事如何,且听下回分解~