Rabbit简单模式理解

2024-03-31 09:36
文章标签 简单 模式 理解 rabbit

本文主要是介绍Rabbit简单模式理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简单模式

我们以最普通的方式去理解,并没有整合Springboot的那种

这是最简单的模式,一个生产者,一个消费者,一个队列

在这里插入图片描述

测试

1、 导包,没整合,不需要编写配置

2、需要生产者消费者

  • 导包
<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.10.0</version>
</dependency>
  • Producer
public class Producer {public static void main(String[] args) {//ip port//创建连接工厂ConnectionFactory connectionFactory = new ConnectionFactory();//创建连接工程connectionFactory.setHost("47.120.50.213");connectionFactory.setPort(5672);connectionFactory.setUsername("admin");connectionFactory.setPassword("admin");connectionFactory.setVirtualHost("/");//创建连接connectionConnection connection = null;Channel channel = null;try {connection = connectionFactory.newConnection("producer");//通过连接获取通道Channelchannel = connection.createChannel();//通过创建交换机,声明队列,绑定关系,路由key,发送接收消息String queueName = "queue";/*** 队列的名称* 是否要持久化* 排他性,是否独占独立* 是否自动删除,在最后一个消费者消费完后* 携带附属参数*/channel.queueDeclare(queueName,false,false,false,null);String message = "hello world";//发送消息到消息队列channel.basicPublish("",queueName,null,message.getBytes());System.out.println("消息发送成功");} catch (IOException e) {throw new RuntimeException(e);} catch (TimeoutException e) {throw new RuntimeException(e);}finally {//关闭连接if(channel != null && channel.isOpen()){try {channel.close();} catch (IOException e) {throw new RuntimeException(e);} catch (TimeoutException e) {throw new RuntimeException(e);}}if(connection != null && connection.isOpen()){try {connection.close();} catch (IOException e) {throw new RuntimeException(e);}}}}
}
  • Consumer
public class Consumer {public static void main(String[] args) {//ip port//创建连接工厂ConnectionFactory connectionFactory = new ConnectionFactory();//创建连接工程connectionFactory.setHost("47.120.50.213");connectionFactory.setPort(5672);connectionFactory.setUsername("admin");connectionFactory.setPassword("admin");connectionFactory.setVirtualHost("/");//创建连接connectionConnection connection = null;Channel channel = null;try {connection = connectionFactory.newConnection("producer");//通过连接获取通道Channelchannel = connection.createChannel();//第一个是消息队列的名字channel.basicConsume("queue", true, new DeliverCallback() {@Overridepublic void handle(String s, Delivery message) throws IOException {System.out.println("收到的消息的是"+new String(message.getBody(),"UTF-8"));}},new CancelCallback() {@Overridepublic void handle(String s) throws IOException {System.out.println("接收消息失败");}});System.out.println("开始接收消息");System.in.read();} catch (IOException e) {throw new RuntimeException(e);} catch (TimeoutException e) {throw new RuntimeException(e);}finally {//关闭连接if(channel != null && channel.isOpen()){try {channel.close();} catch (IOException e) {throw new RuntimeException(e);} catch (TimeoutException e) {throw new RuntimeException(e);}}if(connection != null && connection.isOpen()){try {connection.close();} catch (IOException e) {throw new RuntimeException(e);}}}}
}

总结

代码流程

在这里插入图片描述

  • 上述消息没有设置为持久化

  • 没持久化,消息创建了依旧存在,除非服务器重启,就会删除

  • 持久化,服务器重启后都不会删除

  • 发送消息

    • channel.queueDeclare(queueName,false,false,false,null);
      String message = "hello world";
      //发送消息到消息队列
      channel.basicPublish("",queueName,null,message.getBytes());
      
  • 接收消息

    • channel.basicConsume("queue", true, new DeliverCallback() {@Overridepublic void handle(String s, Delivery message) throws IOException {System.out.println("收到的消息的是"+new String(message.getBody(),"UTF-8"));}
      },new CancelCallback() {@Overridepublic void handle(String s) throws IOException {System.out.println("接收消息失败");}
      }
      );
      

问题

1、连接超时

在这里插入图片描述

这里可能是NO access ,点击admin修改

在这里插入图片描述

命令方式给用户分配权限

rabbitmqctl set_permissions -p / admin '*' '.*' '.*' 给用户分配权限

发现并没有解决问题

  • 访问的端口时5672,因为15672是给web访问的所以需要访问5672
  • 需要开通安全组与端口号,即5672,15672都需要开启
#开启端口
[root@iZf8zhsqf64x47n1tpdy6oZ rabbitmq]# firewall-cmd --zone=public --add-port=15672/tcp --permanent    
#重启防火墙
firewall-cmd --reload
#需要开启远程安全组

思考

为什么基于channel而不是连接??????

一个应用有多个线程需要从rabbitmq中消费,或是生产消息,那么必然会建立很多个connection ,也就是多个tcp连接,对操作系统而言,建立和销毁tcp连接是很昂贵的开销,如果遇到使用高峰,性能瓶颈也随之显现,rabbitmq采用类似nio的做法,连接tcp连接复用,不仅可以减少性能开销,同时也便于管理

这篇关于Rabbit简单模式理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/864017

相关文章

Python中Request的安装以及简单的使用方法图文教程

《Python中Request的安装以及简单的使用方法图文教程》python里的request库经常被用于进行网络爬虫,想要学习网络爬虫的同学必须得安装request这个第三方库,:本文主要介绍P... 目录1.Requests 安装cmd 窗口安装为pycharm安装在pycharm设置中为项目安装req

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

Go语言实现桥接模式

《Go语言实现桥接模式》桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化,本文就来介绍一下了Go语言实现桥接模式,感兴趣的可以了解一下... 目录简介核心概念为什么使用桥接模式?应用场景案例分析步骤一:定义实现接口步骤二:创建具体实现类步骤三:定义抽象类步骤四:创建扩展抽象类步

GO语言实现串口简单通讯

《GO语言实现串口简单通讯》本文分享了使用Go语言进行串口通讯的实践过程,详细介绍了串口配置、数据发送与接收的代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录背景串口通讯代码代码块分解解析完整代码运行结果背景最近再学习 go 语言,在某宝用5块钱买了个

SpringBoot整合Apache Spark实现一个简单的数据分析功能

《SpringBoot整合ApacheSpark实现一个简单的数据分析功能》ApacheSpark是一个开源的大数据处理框架,它提供了丰富的功能和API,用于分布式数据处理、数据分析和机器学习等任务... 目录第一步、添加android依赖第二步、编写配置类第三步、编写控制类启动项目并测试总结ApacheS

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf

C++中的解释器模式实例详解

《C++中的解释器模式实例详解》这篇文章总结了C++标准库中的算法分类,还介绍了sort和stable_sort的区别,以及remove和erase的结合使用,结合实例代码给大家介绍的非常详细,感兴趣... 目录1、非修改序列算法1.1 find 和 find_if1.2 count 和 count_if1

Redis中群集三种模式的实现

《Redis中群集三种模式的实现》Redis群集有三种模式,分别是主从同步/复制、哨兵模式、Cluster,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1. Redis三种模式概述2、Redis 主从复制2.1 主从复制的作用2.2 主从复制流程2

GO语言zap日志库理解和使用方法示例

《GO语言zap日志库理解和使用方法示例》Zap是一个高性能、结构化日志库,专为Go语言设计,它由Uber开源,并且在Go社区中非常受欢迎,:本文主要介绍GO语言zap日志库理解和使用方法的相关资... 目录1. zap日志库介绍2.安装zap库3.配置日志记录器3.1 Logger3.2 Sugared

深入理解Redis线程模型的原理及使用

《深入理解Redis线程模型的原理及使用》Redis的线程模型整体还是多线程的,只是后台执行指令的核心线程是单线程的,整个线程模型可以理解为还是以单线程为主,基于这种单线程为主的线程模型,不同客户端的... 目录1 Redis是单线程www.chinasem.cn还是多线程2 Redis如何保证指令原子性2.