RabbitMQ 之 Hello World
一、概述
RabbitMQ 有很多的使用模式,具体的可以去参考官网,本次我们将简单的搭建一个 Hello World,该模式下只有一个 Producer(生产者)、一个队列(Queue)、一个消费者(Consumer)
二、RabbitMQ 核心工作原理
三、引入对应的依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | <dependencies> <!--RabbitMQ 依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version> 1.2 . 47 </version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version> 2.9 . 2 </version> </dependency> <!--RabbitMQ 测试依赖--> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source> 8 </source> <target> 8 </target> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> |
四、生产者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | @Slf4j public class Producer { private static final String QUEUE_NAME = "helloWorld" ; private static final String HOST_ADDRESS = "192.168.59.135" ; private static final String USER_NAME = "admin" ; private static final String PASSWORD = "admin123" ; public static void main(String[] args) throws Exception { // 创建连接工厂 ConnectionFactory factory = new ConnectionFactory(); // 设置主机地址、用户名、密码 factory.setHost(HOST_ADDRESS); factory.setUsername(USER_NAME); factory.setPassword(PASSWORD); // 使用连接工厂创建连接对象 Connection connection = factory.newConnection(); // 使用连接对象创建信道 Channel channel = connection.createChannel(); // 声明队列 channel.queueDeclare(QUEUE_NAME, false , false , true , null ); // 定义要发送的消息 String message = "xiaomaomao" ; /** * 发送消息 * 参数一、交换机名称,如果使用空字符串("")则代表使用默认交换机 * 参数二、队列名称 * 参数三、消息的类型(是否持久化、优先级) * 参数四、真正要发送的消息内容(二进制形式) */ for ( int i = 1 ; i < 11 ; i++) { channel.basicPublish( "" , QUEUE_NAME, MessageProperties.PERSISTENT_BASIC, message.getBytes(StandardCharsets.UTF_8)); } log.info( "producer send message successfully" ); } } |
五、消费者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | @Slf4j public class Consumer { private static final String QUEUE_NAME = "helloWorld" ; private static final String HOST_ADDRESS = "192.168.59.135" ; private static final String USER_NAME = "admin" ; private static final String PASSWORD = "admin123" ; public static void main(String[] args) throws Exception { // 创建连接工厂 ConnectionFactory factory = new ConnectionFactory(); // 设置主机地址、用户名、密码 factory.setHost(HOST_ADDRESS); factory.setUsername(USER_NAME); factory.setPassword(PASSWORD); // 连接工厂创建连接对象 Connection connection = factory.newConnection(); // 连接对象创建信道 Channel channel = connection.createChannel(); /** * 声明队列 * 参数一、队列名称 * 参数二、队列是否持久化 * 参数三、是否是排它队列 * 参数四、是否自动删除(如果该队列没有生产者/消费者使用,那么该队列会自动删除) * 参数五、其它参数 */ channel.queueDeclare(QUEUE_NAME, false , false , true , null ); // 消息成功投递时会回调该接口 DeliverCallback deliverCallback = (consumerTag, delivery) -> { try { /** * 手动确认 * 参数一、消息标记 * 参数二、是否批量确认 true:应答所有消息,包括传递过来的消息 false:只应答传递过来的那个消息(接收到的那个消息) */ channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false ); String message = new String(delivery.getBody()); log.info( "接收到的消息是: {}" , message); } catch (Exception e) { log.info( "消费出错,出错的消息拒绝接收并重新进入队列" ); /** * 参数一、消息标记 * 参数二、true:消费消息出错时拒绝消息,拒绝的消息将重新进入队列排队,false:不再重新进入队列排队 */ channel.basicReject(delivery.getEnvelope().getDeliveryTag(), true ); } }; // 取消消费者时会回调该接口 CancelCallback cancelCallback = (x) -> { log.info( "取消消费者时会回调该接口" ); }; /** * 参数一、队列名称 * 参数二、true:自动确认 false:手动确认 * 参数三、消息成功投递到队列的回调函数 * 参数四、取消消费者时的回调函数 */ channel.basicConsume(QUEUE_NAME, false , deliverCallback, cancelCallback); } } |
六、测试过程及结果
1、先启动生产者发送消息
2、启动消费者消费消息
消费者控制台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?