SpringAMQP

SpringAMQT

  • RabbitMQ
    • 安装与部署
    • RabbitMQ结构
    • 简单队列模型
  • SpringAMQP
    • 依赖引入
    • 配置RabbitMQ连接信息
    • 基本模型
      • 简单队列模型
      • WorkQueue模型
    • 发布订阅模型
      • FanoutExchange
      • DirectExchange
      • TopicExchange
    • 消息转换器

消息队列是实现异步通讯的一种方式,我们将从RabbitMQ为例开始介绍SpringAMQT。

RabbitMQ

RabbitMQ是基于Erlang语言开发的开源消息通信中间件。

安装与部署

由于RabbitMQ运行需要安装Erlang,为了方便部署,我们采用docker的方式来部署RabbitMq

首先拉取RabbitMQ的镜像,带有management的Tag的说明该镜像含有Web控制台

docker pull rabbitmq:3-management

执行下面的命令来运行RabbitMQ容器

docker run \
-e RABBITMQ_DEFAULT_USER=username \
-e RABBITMQ_DEFAULT_PASS=password \
--name mq \
-p 15672:15672 \
-p 5672:5672 \
-d \
rabbitmq:3-management

username和password是进入RabbitMQ控制台时使用的账号密码,15672端口是控制台所占用的端口,5672是MQ服务所占用的端口。

RabbitMQ结构

  • channel: 操作MQ的工具
  • exchange: 路由消息到队列中
  • queue: 缓存消息
  • virtual host:虚拟主机,是对queue、exchange等资源的逻辑分组
    在这里插入图片描述

简单队列模型

消息发布者

@SpringBootTest
class PublisherApplicationTests {@Testvoid publisher() throws IOException, TimeoutException {//建立连接ConnectionFactory factory = new ConnectionFactory();factory.setHost("192.168.111.135");factory.setPort(5672);factory.setUsername("username");factory.setPassword("password");factory.setVirtualHost("/");Connection connection=factory.newConnection();//创建通道Channel channel=connection.createChannel();//创建队列String queueName="simple.queue";channel.queueDeclare(queueName,false,false,false,null);//发布消息String message="hello,rabbitmq!";for (int i = 0; i < 100; i++) {channel.basicPublish("",queueName,null,message.getBytes());}channel.close();connection.close();}

消息消费者

public class Consumer {public static void main(String[] args) throws IOException, TimeoutException {//建立连接ConnectionFactory factory = new ConnectionFactory();factory.setHost("192.168.111.135");factory.setPort(5672);factory.setUsername("username");factory.setPassword("password");factory.setVirtualHost("/");Connection connection=factory.newConnection();//建立通道Channel channel=connection.createChannel();//消费端也创建队列是为了防止消费端先启动找不到队列String queueName="simple.queue";channel.queueDeclare(queueName,false,false,false,null);//为通道绑定消费者channel.basicConsume(queueName,true,new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println("消息已被处理");}});}
}

其他的模型将在SpringAMPQ中进行介绍

SpringAMQP

AMQP (Adavance Message Queuing Protocol 高级消息队列协议)是用于在应用程序或之间传递业务消息的开放标准。该协议与语言和平台无关,更符合微服务中独立性的要求。

Spring AMQP 是基于AMQP协议定义的一套API规范,提供了模板来发送和接收消息。包含两个部分,其中spring-amqp是基础抽象,spring-rabbit是底层的默认实现

SpringAMQP的特点:

  • 提供监听容器用于异步处理入站消息
  • 提供RabbitTemplate用于发送和接收消息
  • 提供RabbitAdmin来自动声明队列,交换机和绑定

依赖引入

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

配置RabbitMQ连接信息

spring:rabbitmq:host: 192.168.111.135port: 5672username: usernamepassword: passwordvirtual-host: /

基本模型

简单队列模型

消息发布端

@SpringBootTest
class PublisherApplicationTests {@AutowiredRabbitTemplate rabbitTemplate;@Testvoid publisher(){String queueName="simple.queue";String message="hello,rabbitmq!";rabbitTemplate.convertSendAndReceive(queueName,message);}}

消息消费端

@Component
public class RabbitListenerTest {@RabbitListener(queues = "simple.queue")public void listenSimpleQueueMessage(String message){System.out.println(message);}
}

WorkQueue模型

模型特点:多个消费者绑定到一个队列,同一条消息只会被一个消费者处理。

在默认情况下,消费者会进行消息预取,预取的数量为无限大,这会导致性能不同的消费者处理相同数量的消息,可以通过设置prefetch来控制消费者预取的消息数量

spring:rabbitmq:listener:simple:prefetch: 1

发布订阅模型

发布订阅模式允许将同一消息发送给多个消费者。实现方式是加入了exchange(交换机)

常见的exchange类型有:

  • Fanout: 广播
  • Direct: 路由
  • Topic: 话题

exchange只负责消息路由而不进行存储,路由失败则消息丢失

发布订阅模型分三部

  1. 在consumer服务中声明Exchange、Queue、Binding
  2. 在consumer服务中声明多个消费者
  3. 在publisher服务发送消息到Exchange

FanoutExchange

声明Exchange、Queue、Binding。除了通过在配置类中通过@Bean注解绑定队列和交换机外还可以在@RabbitListener注解中绑定,第二种绑定方式将在下一部分使用

@Configuration
public class FanoutConfig {@Beanpublic FanoutExchange fanoutExchange(){return new FanoutExchange("simple.fanout");}@Beanpublic Queue fanoutQueue1(){return new Queue("fanout.queue1");}@Beanpublic Queue fanoutQueue2(){return new Queue("fanout.queue2");}@Beanpublic Binding bingingQueue1(Queue fanoutQueue1,FanoutExchange exchange){return BindingBuilder.bind(fanoutQueue1).to(exchange);}@Beanpublic Binding bingingQueue2(Queue fanoutQueue2,FanoutExchange exchange){return BindingBuilder.bind(fanoutQueue2).to(exchange);}
}

声明消费者与简单模型没什么差别,就不赘述了。

publisher端将消息发送给交换机有一点小区别

@SpringBootTest
class PublisherApplicationTests {@AutowiredRabbitTemplate rabbitTemplate;@Testvoid publisher(){String exchangeName="simple.fanout";String message="hello,rabbitmq!";//三个参数分别为交换机名、routingkey和消息rabbitTemplate.convertSendAndReceive(exchangeName,"",message);}}

DirectExchange

在上一种交换机中发送消息的第二个参数routingkey我们设置为了空,实际上,每一个Queue与Exchange间都可以设定多个bindingkey,通过routingkey参数,交换机将把消息路由到与其匹配的队列中。

@Component
public class RabbitListenerTest {@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "simple.queue1"),exchange = @Exchange(name = "simple.direct",type = ExchangeTypes.DIRECT),key = {"red","blue"}))public void listenSimpleQueueMessage(String message){System.out.println(message);}
}

TopicExchange

TopicExchange与DirectExchange类似,区别是:

  • TopicExchange的routingkey必须是多个单词的列表,并且以英文句号.分隔。
  • bindingkey支持使用通配符,#匹配零或多个单词,*匹配一个单词。

通过以下代码,你很容易可以发现它的特点

@SpringBootTest
class PublisherApplicationTests {@AutowiredRabbitTemplate rabbitTemplate;@Testvoid publisher(){String exchangeName="simple.fanout";String message="hello,rabbitmq!";rabbitTemplate.convertSendAndReceive(exchangeName,"china.weather",message);}}
@Component
public class RabbitListenerTest {@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "simple.queue1"),exchange = @Exchange(name = "simple.direct",type = ExchangeTypes.Topic),key = "china.*"))public void listenSimpleQueueMessage(String message){System.out.println(message);}
}

消息转换器

我们在使用RabbitTemplate的时候可以发现,它所发送的消息的类型为Object,这意味着它可以发送所有对象。默认它所使用的是jdk的序列化,这样的效率较低。

Spring的对消息对象的处理是由org.springframework.amqp.support.converter.MessageConverter来处理的,只需定义一个MessageConverter类型的Bean即可修改序列化方式。

以jackson的序列化为例

引入jackson的依赖

<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><version>2.9.10</version>
</dependency>

定义MessageConverter类型的Bean

@Bean
public MessageConverter jsonMessageConverter(){return new Jackson2JsonMessageConverter();
}

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

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

相关文章

Python实现一个简单的http服务,Url传参输出html页面

摘要 要实现一个可以接收参数的HTTP服务器&#xff0c;您可以使用Python标准库中的http.server模块。该模块提供了一个简单的HTTP服务器&#xff0c;可以用于开发和测试Web应用程序。 下面是一个示例代码&#xff0c;它实现了一个可以接收参数的HTTP服务器&#xff1a; 代码…

递福巴士是不是骗局呢?

递福巴士的背景介绍 递福巴士是社区服务机构软件。递福巴士是一家提供公益服务的平台&#xff0c;为社区居民提供各种服务和支持的软件。多年来&#xff0c;递福巴士一直致力于社区服务和社会公益&#xff0c;积极推动社区的发展&#xff0c;改善社区居民的生活质量。 递福巴士…

ChessGPT:免费好用的国际象棋对弈AI机器人

对于国际象棋初学者&#xff0c;需要找一个对手来练棋。ChessGPT&#xff0c;就是一个免费好用的AI对弈机器人&#xff0c;非常适合新手来提升&#xff0c;是一个很好的练习伙伴。网站地址是&#xff1a;https://www.chess.com/play/computer&#xff0c;也有手机版app&#xf…

4.9 多协议标记交换MPLS

思维导图&#xff1a; 前言&#xff1a; **4.9 多协议标记交换MPLS笔记** 1. **定义与背景**&#xff1a; - MPLS (多协议标记交换) 是一种由 IETF 开发的新协议。 - “多协议”意味着 MPLS 的上层可以使用多种协议。 - 该协议综合了多家公司的技术&#xff0c;如 C…

GitHub和Gitee的区别以及具体使用

文章目录 GitHub和GiteeGitHub和Gitee区别GitHub的使用Gitee的使用 GitHub和Gitee GitHub和Gitee区别 速度不同&#xff1a;GitHub位于美国&#xff0c;而Gitee位于中国。这意味着在中国使用Gitee可能会有更快的访问速度和更好的稳定性。如果我们希望体验Git飞一般的速度&…

配置公网和私网用户通过非公网口的IP地址访问内部服务器和Internet示例

组网需求 如配置公网和私网用户通过非公网口的IP地址访问内部服务器和Internet示例所示&#xff0c;某小型企业内网部署了一台路由器、一台FTP服务器和一台Web服务器。路由器作为接入网关&#xff0c;为下挂的内网用户提供上网服务&#xff0c;主要包括浏览网页、使用即时通信…

【扩散模型】【文本到音频论文系列翻译二】使用指令微调LLM和潜在扩散模型的文本到音频生成

&#x1f525; &#x1f525;&#x1f525; github: https://github.com/declare-lab/tango 效果&#xff1a;https://tango-web.github.io/ 论文地址&#xff1a;https://arxiv.org/pdf/2304.13731.pdf 数据集audiocaps下载&#xff1a; https://blog.csdn.net/weixin_4350969…

C++笔记之遍历vector的所有方式

C笔记之遍历vector的所有方式 —— 2023年4月15日 上海 code review 文章目录 C笔记之遍历vector的所有方式1.普通for循环2.迭代器版3.const迭代器4.C11引入的范围for循环5.使用auto关键字和迭代器6.使用std::for_each算法7.使用std::for_each和lambda表达式8.普通版vector::at…

Python+playwright 实现Web UI自动化

实现Web UI自动化 技术&#xff1a;Pythonplaywright 目标&#xff1a;自动打开百度浏览器&#xff0c;并搜索“亚运会 金牌榜” 需安装&#xff1a;Playwright &#xff08;不用安装浏览器驱动&#xff09; # 使用浏览器&#xff0c;并可视化打开 browser playwright.ch…

原型链继承

方式一&#xff1a;原型链继承 1.套路&#xff1a; &#xff08;1&#xff09;定义父类型构造函数 &#xff08;2&#xff09;给父类型的原型添加方法 &#xff08;3&#xff09;定义子类型的构造函数 &#xff08;4&#xff09;创建父类型的对象赋值给子类型的原型 &…

分类预测 | MATLAB实现基于BiGRU-AdaBoost双向门控循环单元结合AdaBoost多输入分类预测

分类预测 | MATLAB实现基于BiGRU-AdaBoost双向门控循环单元结合AdaBoost多输入分类预测 目录 分类预测 | MATLAB实现基于BiGRU-AdaBoost双向门控循环单元结合AdaBoost多输入分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于BiGRU-AdaBoos…

音乐制作软件 Ableton Live 11 Suite mac中文版功能介绍

Ableton Live 11 Suite mac是一款专业级别的音乐制作软件&#xff0c;它提供了多种音乐制作和编辑功能&#xff0c;可以帮助用户创建各种音乐作品。界面简单直观&#xff0c;可以方便地进行各种音乐制作操作。它提供了丰富的音乐制作工具和功能&#xff0c;如录音、采样、编曲、…

【数据结构】【C语言】【环形链表约瑟夫问题】

1.问题描述及背景&#xff1a; 著名的Josephus问题 据说著名犹太 历史学家 Josephus有过以下的故事&#xff1a;在罗⻢⼈占领乔塔帕特后&#xff0c;39 个犹太⼈与 Josephus及他的朋友躲到⼀个洞中&#xff0c;39个犹太⼈决定宁愿死也不要被⼈抓到&#xff0c;于是决定了⼀个⾃…

spacy.load(“en_core_web_trf“)报错TypeError: issubclass() arg 1 must be a class

使用spacy时遇到的问题 写在最前面&#xff1a; 安装spacy和en_core_web_trf时需要保证二者版本一致 安装及查看对应spacy版本 安装 pip install spacy查看版本 import spacy spacy.__version__安装en_core_web_trf 直接安装&#xff08;如果可以的话&#xff09; pytho…

Django实现音乐网站 (21)

使用Python Django框架做一个音乐网站&#xff0c; 本篇音乐播放器功能完善及原有功能修改。 目录 播放列表修改 视图修改 删除、清空播放器 设置路由 视图处理 修改加载播放器脚本 模板修改 脚本设置 清空功能实现 删除列表音乐 播放列表无数据处理 视图修改 播放…

Linux环境部署应用必知必会

修改环境变量 Linux环境变量配置的6种方法&#xff0c;建议收藏&#xff01; - 知乎 修改java环境变量 软件安装 安装redis redis是一个非关系型数据库&#xff0c;是一个存储键值对的数据库&#xff0c;通常被称为数据结构服务器。 值&#xff08;value&#xff09;可以是…

《红蓝攻防对抗实战》二.内网探测协议出网之TCP/UDP协议探测出网

目录 一.TCP/UDP协议探测出网 1.NC工具探测TCP协议出网 2.Telnet命令探测TCP协议出网 3.UDP协议探测出网 当红队人员在进行内网渗透时&#xff0c;经常会遇到目标主机不出网的场景&#xff0c;而主机不出网的原因有很多&#xff0c;常见的原因例如目标主机未设置网关&#…

Zoho Creator推出全新的Canvas布局设计器功能

自2021年Zoho CRM的UI设计工具——Canvas画布功能发布以来&#xff0c;受到了广泛好评&#xff0c;它的出现为CRM的页面布局形式提供了更多选择和可能&#xff0c;让CRM用户彻底告别了“单调、死板、机械”的交互页面。 8月1日&#xff0c;Zoho Creator也推出了全新的Canvas画…

大数据之LibrA数据库系统服务部署原则及运行环境要求

服务部署原则 FusionInsight LibrA集群由多种服务按照一定的逻辑架构组合而成&#xff0c;每个服务包含一个或多个角色&#xff0c;每个角色可以部署一个或多个实例。 服务&#xff1a;服务对外表现为集群提供的组件业务能力&#xff0c;集群中的每个组件对应一个服务名&…

【LeetCode:86. 分隔链表 | 链表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…