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

相关文章

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

windows和Linux安装Jmeter与简单使用方式

《windows和Linux安装Jmeter与简单使用方式》:本文主要介绍windows和Linux安装Jmeter与简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows和linux安装Jmeter与简单使用一、下载安装包二、JDK安装1.windows设

SQL Server身份验证模式步骤和示例代码

《SQLServer身份验证模式步骤和示例代码》SQLServer是一个广泛使用的关系数据库管理系统,通常使用两种身份验证模式:Windows身份验证和SQLServer身份验证,本文将详细介绍身份... 目录身份验证方式的概念更改身份验证方式的步骤方法一:使用SQL Server Management S

Redis高可用-主从复制、哨兵模式与集群模式详解

《Redis高可用-主从复制、哨兵模式与集群模式详解》:本文主要介绍Redis高可用-主从复制、哨兵模式与集群模式的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录Redis高可用-主从复制、哨兵模式与集群模式概要一、主从复制(Master-Slave Repli