Springboot整合MQ学习记录

Mq介绍

RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。支持Windows、Linux/Unix、MAC OS X操作系统和包括JAVA在内的多种编程语言。

引入Pom

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

具体的模型。概念都不说了。直接看代码

控制器测试代码

package com.example.demoamqp.controller;import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import com.example.demoamqp.entity.Order;
import com.example.demoamqp.send.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;/*** @version 1.0.0* @className: TestSendMqController* @description: 消息发送者* @author: zhangjunfa* @date: 2023/6/16 11:05*/
@Slf4j
@RequestMapping
@RestController
public class TestSendMqController {private Sender sender;private FanoutSender fanoutSender;private TopicSender topicSender;private DeadSender deadSender;private DelayQueueSender delayQueueSender;private Delay2Sender delay2Sender;public TestSendMqController(Sender sender, FanoutSender fanoutSender, TopicSender topicSender, DeadSender deadSender, DelayQueueSender delayQueueSender, Delay2Sender delay2Sender) {this.sender = sender;this.fanoutSender = fanoutSender;this.topicSender = topicSender;this.deadSender = deadSender;this.delayQueueSender = delayQueueSender;this.delay2Sender = delay2Sender;}@PostMapping("/send")public Object send(@RequestParam(name = "param") String param) throws InterruptedException {Thread.sleep(3000);sender.send(param);return "success";}@PostMapping("/sendSimple")public Object sendSimple(@RequestParam(name = "orderName") String orderName) throws InterruptedException {Order order = new Order();order.setId(IdUtil.getSnowflakeNextId());order.setOrderName(orderName);order.setOrderNo(IdUtil.nanoId());order.setCreatedTime(DateUtil.date());sender.sendSimple(order);return "success";}@PostMapping("/sendCode")public Object sendCode() throws InterruptedException {int randomInt = RandomUtil.randomInt(100000, 999999);log.info("生产者生成了一个验证码:{}", randomInt);this.fanoutSender.sendCode(String.valueOf(randomInt));return "success";}@PostMapping("/sendTopic")public Object sendTopic(@RequestParam(name = "msg") String msg, @RequestParam(name = "routingKey") String routingKey) throws InterruptedException {this.topicSender.sendMsg(msg, routingKey);return "success";}/*** 延迟队列(死信)设计** @param msg* @return* @throws InterruptedException*/@PostMapping("/sendDead")public Object sendDead(@RequestParam(name = "msg") String msg) throws InterruptedException {this.deadSender.sendDelay(msg, 2000);return "success 我是死信队列";}/*** 延迟队列设计** @param msg* @return* @throws InterruptedException*/@PostMapping("/sendDelay")public Object sendDelay(@RequestParam(name = "msg") String msg) throws InterruptedException {this.delayQueueSender.sendMsg(msg);return "success 我是延迟队列";}/*** 延迟队列设计** @param msg* @return* @throws InterruptedException*/@PostMapping("/sendDelay2")public Object sendDelay2(@RequestParam(name = "msg") String msg,@RequestParam(name = "delayTime") Integer delayTime) throws InterruptedException {this.delay2Sender.sendDelay2(msg,delayTime);return "success 我是延迟队列";}
}

配置类代码

package com.example.demoamqp.config;import com.example.demoamqp.conatants.Constants;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 创建消息队列并注入容器中** @author ross*/@Configuration
public class QueueConfig {/*** 创建队列** @return*/@Beanpublic Queue createQueue() {return new Queue("ross_amq");}/******************************  发布、订阅者模式  *********************************/@Bean // 邮箱的队列public Queue mailQueue(){return new Queue(Constants.MQ_MAIL_QUEUE,Constants.durable,Constants.exclusive,Constants.autoDelete);}@Bean // 电话的队列public Queue phoneQueue(){return new Queue(Constants.MQ_PHONE_QUEUE,Constants.durable,Constants.exclusive,Constants.autoDelete);}@Bean // 交换机public FanoutExchange fanoutExchange(){return new FanoutExchange(Constants.MQ_FANOUT_EXCHANGE,Constants.durable,Constants.autoDelete);}/*** 邮箱绑定交换机* @return*/@Beanpublic Binding mailBinding(){return BindingBuilder.bind(mailQueue()).to(fanoutExchange());}/*** 电话绑定交换机* @return*/@Beanpublic Binding phoneBinding(){return BindingBuilder.bind(phoneQueue()).to(fanoutExchange());}/*----------------------------------------------------*/@Bean // A队列public Queue topicAQueue(){return new Queue(Constants.MQ_TOPIC_QUEUE_A,Constants.durable,Constants.exclusive,Constants.autoDelete);}/*** topic模式相关配置*/@Bean // B队列public Queue topicBQueue(){return new Queue(Constants.MQ_TOPIC_QUEUE_B,Constants.durable,Constants.exclusive,Constants.autoDelete);}@Bean // topic的交换机public TopicExchange topicMyExchange(){return new TopicExchange(Constants.MQ_TOPIC_EXCHANGE,Constants.durable,Constants.autoDelete);}@Beanpublic Binding topicAQueueBinding(){return BindingBuilder.bind(topicAQueue()).to(topicMyExchange()).with("topic.xxx"); // 规则 topic.xxx}@Beanpublic Binding topicBQueueBinding(){return BindingBuilder.bind(topicBQueue()).to(topicMyExchange()).with("topic.*"); // 规则 topic.xxx}
}

消费者

package com.example.demoamqp.receiver;import cn.hutool.core.date.DateUtil;
import com.example.demoamqp.conatants.Constants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;/*** 死信队列消费者* @className: MqDelayReceiver* @projectName: demo-one* @auth: rosszhang* @date: 2023/12/28 16:53*/
@Slf4j
@Component
public class MqDelayReceiver {@RabbitListener(queues = Constants.MQ_DELAY_QUEUE)public void delayConsume(String msg) {log.debug("[消费者消费信息:{},时间:{}", msg, DateUtil.date());}}

发送者代码

package com.example.demoamqp.send;import cn.hutool.core.date.DateUtil;
import com.example.demoamqp.conatants.Constants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;/*** 死信队列** @className: DeadSender* @projectName: demo-one* @auth: rosszhang* @date: 2023/12/28 16:49*/
@Slf4j
@Component
public class DeadSender {private AmqpTemplate rabbitAmqpTemplate;@Autowiredpublic void setRabbitAmqpTemplate(AmqpTemplate rabbitAmqpTemplate) {this.rabbitAmqpTemplate = rabbitAmqpTemplate;}/*** 死信队列** @param msg* @param delayTime*/public void sendDelay(String msg, int delayTime) {rabbitAmqpTemplate.convertAndSend(Constants.MQ_NORMAL_EXCHANGE,Constants.MQ_NORMAL_ROUTING_KEY,msg,process -> {process.getMessageProperties().setExpiration(String.valueOf(delayTime));return process;});log.debug("[生产者:]发送消息:{},时间{},延迟{}秒", msg, DateUtil.date(), delayTime / 1000);}
}

源码大家可以看我Gitte地址
Gitte仓库地址

下面这个是我的个人公共号 只会写Bug的程序猿,大家可以关注一下,一键三连。相互交流学习。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/327498.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读_InP-Based_Generic_Foundry_Platform_for_Photonic_Integrated_Circuits

InP-Based_Generic_Foundry_Platform_for_Photonic_Integrated_Circuits 时间&#xff1a;2018年 作者&#xff1a;Luc M. Augustin, Member, IEEE, Rui Santos, Erik den Haan, Steven Kleijn, Peter J. A. Thijs, Sylwester Latkowski, Senior Member, IEEE, Dan Zhao, Wei…

计算机毕业设计 SpringBoot的一站式家装服务管理系统 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

探讨一下WebINFO 下的一些思考

在平时的开发中&#xff0c;我们经常看到一个/WEB-INF 这个目录&#xff0c;这个是web 容器初始化加载的一个标准路径。官方解释&#xff1a;WEB-INF 是 Java 的 web 应用的安全目录。所谓安全就是客户端无法访问&#xff0c;只有服务端可以访问的目录。也就是说&#xff0c;这…

拜佛行善心要诚,否则就是不敬!

佛教所主张的“善因有善果&#xff0c;恶因有恶果”&#xff0c;又叫做“善有善报&#xff0c;恶有恶报”。峰民佛学悟语&#xff1a;“善有善报&#xff0c;恶有恶报。不是不报&#xff0c;时辰未到。”这句话表达的是一种因果循环、报应不爽的善恶法则&#xff0c;它告诉我们…

Redis 键中冒号的用途是什么?可以使匹配查询更快吗?

Redis 键中冒号的用途是什么在Redis中&#xff0c;冒号&#xff08;:&#xff09;用作键的分隔符&#xff0c;它的主要作用是创建层次结构和命名空间。通过在键中使用冒号&#xff0c;可以将键分为多个部分&#xff0c;从而更好地组织和管理数据。 以下是冒号在Redis键中的用途…

uniapp中uview组件库CircleProgress 圆形进度条丰富的使用方法

目录 #内部实现 #平台差异说明 #基本使用 #设置圆环的动画时间 #API #Props 展示操作或任务的当前进度&#xff0c;比如上传文件&#xff0c;是一个圆形的进度环。 #内部实现 组件内部通过canvas实现&#xff0c;有更好的性能和通用性。 #平台差异说明 AppH5微信小程…

计算机毕业设计选题分享-SSM律师事务所业务管理系统01664(赠送源码数据库)JAVA、PHP,node.js,C++、python,大屏数据可视化等

SSM律师事务所业务管理系统 摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;律师事务所业务管理系统当然也不能排除在外。律师事务所业务管理系统是以实际运用为开发背景…

AWS(三):如何在AwsManagedAd目录和windowsAD实例之间建立双向信任。

前提&#xff1a; 1.创建好了一个AWS managed AD目录&#xff0c;我的目录域名为:aws.managed.com 2.创建好了一个windows AD实例并提升了为域控服务器,实例域名为:aws2.com 看过我AWS 一和二的应该都会创建windows实例了&#xff0c;切记不能将其无缝加入到aws managed AD的…

静态网页设计——电影推荐网(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; https://www.bilibili.com/video/BV1NK411x7oK/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术&#xff1a;HTMLCSSJS&#xff08;…

【mars3d】new mars3d.layer.GeoJsonLayer(实现环状面应该怎么传data

问题&#xff1a;【mars3d】new mars3d.layer.GeoJsonLayer(实现环状面应该怎么传data 解决方案&#xff1a; 1.在示例中修改showDraw()方法的data数据&#xff0c;实现以下环状面效果 2.示例链接&#xff1a; 功能示例(Vue版) | Mars3D三维可视化平台 | 火星科技 export f…

Merge还是Rebase?这次终于懂了

《Git分支管理&#xff1a;Merge还是Rebase&#xff1f;》 导语&#xff1a; 在Git的分支管理中&#xff0c;Merge和Rebase是两种常见的合并策略&#xff0c;每一种都有其优劣之处。究竟应该选择Merge还是Rebase&#xff0c;取决于项目的需求和团队的工作流程。本文将深入探讨…

基于FFT + CNN - Transformer 时域、频域特征融合的轴承故障识别模型

目录 往期精彩内容&#xff1a; 前言 1 快速傅里叶变换FFT原理介绍 2 轴承故障数据的预处理 2.1 导入数据 2.2 制作数据集和对应标签 3 基于FFTCNN-Transformer的轴承故障识别模型 3.1 网络定义模型 3.2 设置参数&#xff0c;训练模型 3.3 模型评估 往期精彩内容&…