RabbitMQ入门案例之Simple简单模式

news2025/2/3 22:54:43

RabbitMQ入门案例之Simple简单模式

  • 前言
  • 什么是Simple模式
  • Simple模式操作
  • RabbitMQ管理界面的部分介绍

前言

本文将介绍RabbitMQ的七种工作模式的第一种Simple模式的代码实现,编程工具使用的是IDEA,在RabbitMQ中的工作模式都是生产消费模型

生产者消费模型的介绍已经手写可以参考笔者的这篇文章:多线程实操&&阻塞队列

官网文档地址:https://rabbitmq.com/getstarted.html

什么是Simple模式

所谓Simple模式就是简单的一个生产者p与一个消费者c,一对一的关系,如下图所示:
在这里插入图片描述
在这个过程中,生产者会将消息通过channel通道放入到我们的消息队列queue中,消费者在察觉消息队列中有消息时,会从queue中获取消息。

Simple模式操作

要在IDEA中使用RabbitMQ,创建需要导入下面这些依赖

<!--Java原生RabbitMQ依赖-->
<dependency>
	<groupId>com.rabbitmq</groupId>
	<artifactId>amqp-client</artifactId>
	<version>5.10.0</version>
 </dependency>

创建一个Simple包,在包里面创建两个类,Producer(生产者)和Consumer(消费者)

Producer代码如下

/**
 * 生产者
 */
public class Producer {

    public static void main(String[] args) {
        // 1: 创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        // 2: 设置连接属性
        connectionFactory.setHost(主机地址);//服务器地址
        connectionFactory.setPort(5672);//服务端口号
        connectionFactory.setVirtualHost("/");//消息隔离点,可以类比为数据库中的表
        connectionFactory.setUsername("guest");//登录的身份账号
        connectionFactory.setPassword("guest");//密码

        Connection connection = null;
        Channel channel = null;
        try {
            String queue1 = "queue1";// 消息存放的消息位置
            // 3: 从连接工厂中获取连接
            connection = connectionFactory.newConnection("生产者");
            // 4: 从连接中获取通道channel
            channel = connection.createChannel();
            // 5: 申明队列queue存储消息
            /*
             *  如果队列不存在,则会创建
             *  Rabbitmq不允许创建两个相同的队列名称,否则会报错。
             *
             *  @params1: queue 队列的名称
             *  @params2: durable 队列是否持久化
             *  @params3: exclusive 是否排他,即是否私有的,如果为true,会对当前队列加锁,其他的通道不能访问,并且连接自动关闭
             *  @params4: autoDelete 是否自动删除,当最后一个消费者断开连接之后是否自动删除消息。
             *  @params5: arguments 可以设置队列附加参数,设置队列的有效期,消息的最大长度,队列的消息生命周期等等。
             * */
            channel.queueDeclare(queue1, false, false, false, null);
            // 6: 准备发送消息的内容
            String message = "我宇宙超级无敌终极爱学习!!!";
            // 7: 发送消息给中间件rabbitmq-server
            // @params1: 交换机exchange,为空的话会使用默认的dirct模式交换机
            // @params2: 队列名称/routing
            // @params3: 属性配置
            // @params4: 发送消息的内容
            channel.basicPublish("",queue1,null,message.getBytes(StandardCharsets.UTF_8));
            System.out.println("信息发布成功");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("信息发布失败.....");
        }finally {
            // 先释放通道再释放连接
            // 7: 释放连接关闭通道
            if(channel != null && channel.isOpen()){
                try {
                    channel.close();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (TimeoutException e) {
                    e.printStackTrace();
                }
            }
            if(connection != null   ){
                try {
                    connection.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

执行结果如下图:
在这里插入图片描述
我们到RabbitMQ的管理界面看看消息是否被放进了queue1中(Queue->queue1–>getMessges),结果如下:
在这里插入图片描述

Consumer代码如下:

/**
 * 消费者
 */
public class Consumer {
    public static void main(String[] args) {
        // 1: 创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        // 2: 设置连接属性
        connectionFactory.setHost(主机地址);
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/");
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        Connection connection = null;
        Channel channel = null;
        try {
            String queue1 = "queue1";
            // 3: 从连接工厂中获取连接
            connection = connectionFactory.newConnection("消费者");
            // 4: 从连接中获取通道channel
            channel = connection.createChannel();
            // 5: 从队列中接收消息
            channel.basicConsume(queue1, true, new DeliverCallback() {
                @Override
                public void handle(String consumerTag, Delivery message) throws IOException {
                    System.out.println("接收到了消息是:" + new String(message.getBody(),"UTF-8"));
                }
            }, new CancelCallback() {
                @Override
                public void handle(String s) throws IOException {
                    System.out.println("消息接收失败~~");
                }
            });
            // 这里需要这样设置是因为防止信息还没有读取到程序就结束了,因为上面的代码是异步的,下面开始执行了,上面都不一定执行完毕
            System.out.println("开始接收消息...");
            System.in.read();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("信息发布失败.....");
        } finally {
            // 先释放通道再释放连接
            // 6: 释放连接关闭通道
            if (channel != null && channel.isOpen()) {
                try {
                    channel.close();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (TimeoutException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

执行结果:
在这里插入图片描述
RabbitMQ服务界面查看一下是否还有消息
在这里插入图片描述
total已经为0了,所以刚刚的消息被读取到了

RabbitMQ管理界面的部分介绍

既然我们刚刚使用到了管理界面,那当然要做一下简单介绍,如下图:

Queue功能释义

在这里插入图片描述

queue1的详情页

在这里插入图片描述
消息获取模式说明:
在这里插入图片描述

  • NACK应答:不告诉RabbitMQ-Server消息被消费了,重新放入消息队列中,简单说就是盯了一眼就放回去
  • ACK应答:告诉RabbitMQ-Server消息被消费了,消息会重消息队列中去
以上是RabbitMQ入门案例的全部内容,感谢阅读~~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android系统的Ashmem匿名共享内存子系统分析(4)- Ashmem子系统的 Java访问接口

声明 其实对于Android系统的Ashmem匿名共享内存系统早就有分析的想法&#xff0c;记得2019年6、7月份Mr.Deng离职期间约定一起对其进行研究的&#xff0c;但因为我个人问题没能实施这个计划&#xff0c;留下些许遗憾…文中参考了很多书籍及博客内容&#xff0c;可能涉及的比较…

【云原生】Docker镜像的创建

1.Dokcer镜像的创建 创建镜像有三种方法&#xff0c;分别为【基于已有镜像创建】、【基于本地模板创建】以及【基于Dockerfile创建】。 1.1 基于现有镜像创建 &#xff08;1&#xff09;首先启动一个镜像&#xff0c;在容器里做修改 docker run -it --name web centos:7 /…

2023年6月 国内大语言模型对比【国内模型正在崛起】

先说一下这个文章怎么来的。因为朋友问我大语言模型可以生成公务员面试回答不&#xff0c;我说可以啊。之前看文心有这个服务。我想最近好几个模型也没用了测一把&#xff01;结果&#xff01;大吃一惊&#xff01;我觉得我的三个傻孩子长大了&#xff01;&#xff08;chatglm1…

chatgpt赋能python:Python如何降低版本:提升代码兼容性与SEO效果

Python如何降低版本&#xff1a;提升代码兼容性与SEO效果 在大多数情况下&#xff0c;使用Python的最新版本是最好的选择。新版本通常提供更好的性能和更多的功能&#xff0c;同时也有更好的安全性和稳定性。然而&#xff0c;有些情况下&#xff0c;我们需要运行旧版本的Pytho…

chatgpt赋能python:Python字体如何调大?一篇全面的教程

Python字体如何调大&#xff1f;一篇全面的教程 什么是Python&#xff1f; Python是一种高级编程语言&#xff0c;一般被用于Web开发、数据分析和人工智能等领域。其编写简单、易读易学易维护&#xff0c;因此被广泛使用。 为什么要调大Python字体&#xff1f; 在Python编程…

imagine 关键词绘图( Midjourney )

前几天从网上看到的imagine 关键词绘图( Midjourney )&#xff0c;感觉挺好用&#xff0c;分享给大家&#xff1a; 一、基本关键词: 一个基本的提示可以简单到一个单词、短语或表情符号。 二、高级关键词: 可以包括一个或多个图像链接、多个文本短语或单词&#xff0c;以及…

内网安全:隧道技术详解

目录 隧道技术 反向连接技术 反向连接实验所用网络拓扑图及说明 网络说明 防火墙限制说明 实验前提说明 实战一&#xff1a;CS反向连接上线 - 拿下Win2008 一. 使用转发代理上线创建监听器 二. 上传后门执行上线 隧道技术 - SMB协议 SMB协议介绍 实战二&#xff1a…

chatgpt赋能python:Python安装到C盘有什么方便之处?

Python安装到C盘有什么方便之处&#xff1f; 在进行Python编程时&#xff0c;安装Python到C盘是一个非常常见的做法。那么&#xff0c;将Python安装到C盘有哪些好处呢&#xff1f;下面&#xff0c;让我们来一一介绍。 1. 方便快捷 安装Python到C盘的好处之一就是非常方便&am…

chatgpt赋能python:Python安装etree:提高XML处理效率的关键

Python安装etree&#xff1a;提高XML处理效率的关键 在Python开发中&#xff0c;XML是一种常用的数据格式。然而&#xff0c;Python标准库自带的ElementTree在大规模数据处理时可能会出现效率低下的情况。因此&#xff0c;我们可以使用第三方模块etree来提高XML处理的效率。 …

案例37:基于Springboot旅游网站系统开题报告设计

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

Linux内核文件读取流程

本文代码基于Linux5.10。 当上层调用read函数读取一个文件时&#xff0c; Linux 内核究竟如何处理&#xff1f; 本文主要介绍这个问题 数据结构 address_space linux 的文件在磁盘上可能是不连续的&#xff0c; 但文件读取又需要将文件当成一个连续的字节流&#xff0c; 为…

大学物理(上)-期末知识点结合习题复习(1)——运动的描述(两类运动学知识点、圆周运动知识点、相对运动知识点)

目录 运动的描述 两类运动知识点 题1 题目描述 题解 题2&#xff08;第一类问题&#xff09; 题目描述 题解 题3&#xff08;第二类问题&#xff09; 题目描述 题解 题4 题目描述 题解 圆周运动知识点 题5 题目描述 题解 相对运动知识点 题6 题目描述…

【通知】关于SRRC认证无线电发射设备型号核准的通知

关于SRRC认证 无线电发射设备型号核准简称型号核准或SRRC&#xff0c;由工业和信息化部无线电管理局受理&#xff0c;中华人民共和国工业和信息化部审批发证。型号核准是指在无线电发射设备投入使用前的研制、生产、进口、购置等环节&#xff0c;对其频谱参数技术指标依法进行…

图文直播功能(互动功能接收端JS-SDK)

图文直播 功能概述 图文直播&#xff0c;即用直播画面与说明文字的形式&#xff0c;以时间轴方式完整详细地记录整场活动/课堂。 当用户错过直播的开始时间&#xff0c;中途进入直播&#xff0c;可通过图文直播的记录对错过的直播进行回顾了解&#xff0c;实现直播信息的有效…

【SpringBoot】SpringBoot Controller接收参数的常用方式

在Controller中加入RestController&#xff0c;效果等于Controller ResponseBody。 1 请求路径参数 直接把表单里面的参数写进 Controller 相应方法的形参中去&#xff0c;这个获取参数的方法适合get提交&#xff0c;而不适合post提交。 PathVariable获取(这个当然不分get和…

Flask学习笔记(1)创建RESTful API

从本文起&#xff0c;笔者将会更新一系列Flask学习笔记。   本文将会讲述在Flask中如何创建RESTful API。在此之前&#xff0c;我们有必要了解下什么是RESTful架构。 RESTful架构 RESTful架构自从2000年被Roy Feilding提出后就受到广泛关注&#xff0c;并被成功地应用于成千…

美国同事的那些离职类型

这次公司的裁员是教科书基本的真的是没错。 但是美国同事的心态和离职类型也让人打开眼界。 后来在公司同事建立的被裁群中才了解到&#xff0c;PM 组也是重灾区&#xff0c;也超过了 50%&#xff0c;不少在公司工作超过 5 年的 PM 都被毫不留情的裁掉了。 就算这次勉勉强强被…

怎么实现常用网络接口自动化测试框架应用?

一、RESTful&#xff08;resource representational state transfer)类型接口测试 (一&#xff09;GUI界面测试工具&#xff1a;jmeter 1、添加线程组 2、添加http请求 3、为线程组添加察看结果树 4、写入接口参数并运行 5、在查看结果树窗口查看结果 6、多组数据可增加CSVDat…

达梦主备守护集群介绍

DM数据守护一主一备或一主多备是一种集成化的高可用、高性能数据库解决方案&#xff0c;是数据库异地容灾的首选方案。通过部署 DM 数据守护&#xff0c;可以在硬件故障&#xff08;如磁盘损坏&#xff09;、自然灾害&#xff08;地震、火灾&#xff09;等极端情况下&#xff0…

javaScript蓝桥杯----收集帛书碎⽚

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 三叔在外出考古途中⽆意发现了⼀份战国帛书&#xff0c;帛书边缘有被明显裁剪过的痕迹&#xff0c;单从帛书⽚段&#xff0c;提到记录了神秘⽂物的地点&#xff0c;⽆奈帛书不完整&#xff0c;为了早⽇将⽂物带回博物…