当前位置: 首页 > news >正文

rabbitMQ 简单使用

安装 rabbitMQ

下载地址:rabbitmq-3.12.0

安装 windows rabbitMQ 需要的命令

进入 rabbitMQ 的 sbin 目录后 cmd (需要管理员权限)
在这里插入图片描述

rabbitmq-plugins.bat enable rabbitmq_management

随后重启 rabbitMQ

#关闭服务
net stop rabbitmq 
#开启服务
net start rabbitmq 

UI 界面地址 (用户名密码都为 guest)

http://localhost:15672

rabbitMQ 在 Java 中的使用

yml 配置

#rabbitmq 配置
rabbitmq:host: localhostport: 5672password: guestusername: guest

依赖引入

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

● 路由键(Routing Key):这是一个字符串,由生产者在发送消息时指定,用于指示交换机应该将消息路由到哪个队列。路由键通常与消息的内容或类型有关。
● 交换机(Exchange):交换机是消息传递的中转站,它负责接收来自生产者的消息,并根据路由键将消息路由到一个或多个队列。
● 队列(Queue):队列是存储消息的地方,消费者从队列中获取消息进行处理。

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;/*** 用于创建交换机和队列(只用在程序启动前执行一次----用@PostConstruct实现)*/
@Slf4j
@Component
public class InitRabbitMqBean {@Value("${spring.rabbitmq.host:localhost}")private String host;// @PostConstruct用于在Spring容器实例化Bean之后执行初始化逻辑,且只执行一次@PostConstructpublic void init() {try {ConnectionFactory factory = new ConnectionFactory();factory.setHost(host);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");log.info("消息队列启动成功");} catch (Exception e) {log.error("消息队列启动失败", e);}}
}
import com.rabbitmq.client.Channel;
import com.wxw.znojbackendjudgeservice.judge.JudgeService;
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;
import javax.annotation.Resource;/*** @description 消息消费者*/
@Component
@Slf4j
public class MyMessageConsumer {@Resourceprivate JudgeService judgeService;// 指定程序监听的消息队列和确认机制@SuppressWarnings("LanguageDetectionInspection")@SneakyThrows// @RabbitListener 是 SpringBoot 中用于简化 RabbitMQ 消息监听器配置的注解// 它允许你将一个方法标记为消息监听器,这样当队列中有消息到达时,SpringBoot 将自动调用该方法来处理消息// 消息确认模式被设置为 MANUAL(消息处理完成后需要手动确认)@RabbitListener(queues = {"code_queue"}, ackMode = "MANUAL")public void receiveMessage(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) {log.info("receiveMessage message = {}", message);long questionSubmitId = Long.parseLong(message);try {judgeService.doJudge(questionSubmitId);// 确认 deliveryTag 标识的单个消息已经被成功处理channel.basicAck(deliveryTag, false);} catch (Exception e) {// 拒绝 deliveryTag 标识的单个消息,并将其重新放回队列中channel.basicNack(deliveryTag, false, false);}}
}
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;/*** 消息生产者*/
@Component
public class MyMessageProducer {@Resourceprivate RabbitTemplate rabbitTemplate;/*** 发送消息* @param exchange* @param routingKey* @param message*/public void sendMessage(String exchange, String routingKey, String message) {rabbitTemplate.convertAndSend(exchange, routingKey, message);}
}

在 OJ 项目中,用户做题后提交,提交的题目 ID 就是消息,此时生产者调用发送消息方法,将题目 ID 作为消息发送给交换机 code_exchange,之后再由交换机决定转发给哪个消费者

@Override
public long doQuestionSubmit(QuestionSubmitAddRequest questionSubmitAddRequest, User loginUser) {// ...// ...Long questionSubmitId = questionSubmit.getId();// 发送消息----异步调用判题服务myMessageProducer.sendMessage("code_exchange", "my_routingKey", String.valueOf(questionSubmitId));// ...// ...
}

相关文章:

  • 9.29总结
  • Sqlserver 死锁指南
  • mysql事务详解
  • hive-拉链表
  • 【源码+文档+调试讲解】无人超市系统python
  • 安卓 shape 的使用
  • 【记录】Excel|不允许的操作:合并或隐藏单元格出现的问题列表及解决方案
  • MySQL InnoDB MVCC数据结构分析
  • smb文件夹共享设置
  • Linux学习之路 -- 线程 -- 条件变量与生产消费模型
  • 【含文档】基于Springboot+微信小程序 的高校二手商品交易平台(含源码+数据库+lw)
  • 物联网系统中OLED屏主流驱动方案详解
  • 构建高效房屋租赁系统:Spring Boot应用
  • Springboot中基于注解实现公共字段自动填充
  • 9.23作业
  • python3.6+scrapy+mysql 爬虫实战
  • $translatePartialLoader加载失败及解决方式
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • Create React App 使用
  • ES6 ...操作符
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • golang中接口赋值与方法集
  • Java深入 - 深入理解Java集合
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • JS数组方法汇总
  • python学习笔记 - ThreadLocal
  • 编写高质量JavaScript代码之并发
  • 构造函数(constructor)与原型链(prototype)关系
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 我有几个粽子,和一个故事
  • 应用生命周期终极 DevOps 工具包
  • 找一份好的前端工作,起点很重要
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 【云吞铺子】性能抖动剖析(二)
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • # windows 安装 mysql 显示 no packages found 解决方法
  • $.ajax,axios,fetch三种ajax请求的区别
  • (+4)2.2UML建模图
  • (0)Nginx 功能特性
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转载)CentOS查看系统信息|CentOS查看命令
  • (转载)Linux 多线程条件变量同步
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .net 8 发布了,试下微软最近强推的MAUI
  • .net core 依赖注入的基本用发
  • .net 使用ajax控件后如何调用前端脚本
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @RestControllerAdvice异常统一处理类失效原因
  • [ C++ ] STL---仿函数与priority_queue
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600