RabbitMQ--Hello World(基础详解)

news2024/10/7 2:25:50

在这里插入图片描述

文章目录

  • 先决条件
  • RabbitMQ 初识
  • RabbitMQ--Hello World
    • 发送
    • 接收

更多相关内容可查看

先决条件

本教程假定 RabbitMQ 已安装并在标准端口 (5672) 上运行。如果你 使用不同的主机、端口或凭据,连接设置将需要 调整。如未安装可查看Windows下载安装RabbitMQ客户端(2024最新篇)

RabbitMQ 初识

RabbitMQ 是一个消息代理:它接受和转发消息。你可以想想 关于它作为邮局:当您将要投递的邮件放入 邮箱,您可以确定信函承运人最终会送达 邮寄给您的收件人。在这个类比中,RabbitMQ 是一个邮箱,一个帖子 办公室和信使。

RabbitMQ 和邮局之间的主要区别在于它没有 而是处理纸张,而是接受、存储和转发二进制数据 blob \u2012 消息。

RabbitMQ 和一般的消息传递使用一些术语。

  • 生产无非是发送。发送消息的程序 是制片人
  • 队列是 RabbitMQ 中邮箱的名称。虽然消息会流动 通过 RabbitMQ和您的应用程序,它们只能存储在队列中。队列仅受主机的内存和磁盘限制的约束,它是 本质上是一个大型消息缓冲区。
  • 许多生产者可以发送发送到一个队列的消息,许多使用者可以尝试从一个队列接收数据。
  • 表示队列的方式:queue_name
  • 消费与接受具有相似的含义。消费者就是一个程序 主要等待接收消息

请注意,生产者、消费者和代理不必驻留在同一个主机;事实上,在大多数应用程序中,它们不会。一个应用程序可以同时是生产者和消费者也是如此。

RabbitMQ–Hello World

我们将用 Java 编写两个程序;一个 发送单条消息的生产者,以及接收 消息并打印出来。我们将在 Java API,专注于这个非常简单的事情,只是为了得到 开始。这是一个消息传递的“Hello World”。

在下图中,“P”是我们的生产者,“C”是我们的消费者。这 中间的框是一个队列 - RabbitMQ 保留的消息缓冲区 代表消费者。

P
你好
C

发送

P
hello

我们将消息发布者(发送者)和消息使用者(接收者)称为 。发布者将连接到 RabbitMQ,发送一条消息, 然后退出。
我们需要导入一些类:


import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;

设置类并命名队列:

public class Send {
  private final static String QUEUE_NAME = "hello";
  public static void main(String[] argv) throws Exception {
      ...
  }
}

然后,我们可以创建与服务器的连接

ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
     Channel channel = connection.createChannel()) {
}

该连接抽象了套接字连接,并负责处理 协议版本协商和认证等为我们服务。这里 我们连接到本地机器上的 RabbitMQ 节点 - 因此是 localhost。如果我们想连接到另一个节点上的节点 机器,我们只需在此处指定其主机名或 IP 地址

接下来我们创建一个通道,这是大多数 API 用于获取 完成的事情驻留。请注意,我们可以使用 try-with-resources 语句 因为两者都实现了. 这样,我们就不需要在代码中显式关闭它们。ConnectionChanneljava.lang.AutoCloseable

要发送,我们必须声明一个队列供我们发送到;然后我们可以发布一条消息 到队列中,所有这些都在 try-with-resources 语句中:

channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "Hello World!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");

声明队列是幂等的 - 只有在不声明的情况下才会创建它 已经存在。消息内容是字节数组,因此可以进行编码 随便你喜欢什么。

发送不起作用!
如果这是您第一次使用 RabbitMQ,并且您没有看到“已发送” 消息,那么你可能会挠头,想知道什么可以 错了。也许代理是在没有足够的可用磁盘空间的情况下启动的 (默认情况下,它至少需要 200 MB 可用空间),因此拒绝 接受消息。检查代理日志文件以确认并减少 必要时限制。配置 文件文档将向您展示如何设置 .disk_free_limit

生产者总体代码如下(便于大家复制粘贴)

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.nio.charset.StandardCharsets;

public class Send {

    private final static String QUEUE_NAME = "hello";

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            String message = "Hello World!";
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));
            System.out.println(" [x] Sent '" + message + "'");
        }
    }
}

接收

我们的消费者会收听来自 RabbitMQ,所以与发布单个消息的发布者不同,我们将让使用者保持运行以侦听消息并将其打印出来。

你好
C

我们将用于缓冲服务器推送给我们的消息的额外界面。DeliverCallback

设置与发布者相同;我们打开一个连接和一个 channel,并声明我们将要从中使用的队列。 请注意,这与发布到的队列匹配。

public class Recv {

  private final static String QUEUE_NAME = "hello";

  public static void main(String[] argv) throws Exception {
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();

    channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    System.out.println(" [*] Waiting for messages. To exit press CTRL+C");

  }
}

请注意,我们也在此处声明队列。因为我们可能会开始 消费者先于发布者,我们要确保队列存在 在我们尝试从中消费消息之前。

我们为什么不使用 try-with-resource 语句来自动关闭 通道和连接?通过这样做,我们只需制作程序即可 继续前进,关闭所有东西,然后退出!这会很尴尬,因为 我们希望在消费者倾听的同时,这个过程仍然有效 异步地让消息到达。

我们将告诉服务器将来自 队列。由于它将异步推送我们消息,因此我们提供了一个 以对象的形式进行回调,该对象将缓冲消息,直到 我们已准备好使用它们。这就是子类的作用。DeliverCallback

DeliverCallback deliverCallback = (consumerTag, delivery) -> {
    String message = new String(delivery.getBody(), "UTF-8");
    System.out.println(" [x] Received '" + message + "'");
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });

消费者总体代码(便于大家复制粘贴)

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
import java.nio.charset.StandardCharsets;

public class Recv {

    private final static String QUEUE_NAME = "hello";

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        System.out.println(" [*] Waiting for messages. To exit press CTRL+C");

        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
            System.out.println(" [x] Received '" + message + "'");
        };
        channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
    }
}

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

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

相关文章

短视频矩阵系统----可视化剪辑独立开发(采用php)

短视频矩阵系统源头技术开发: 打磨短视频矩阵系统的开发规则核心框架可以按照以下几个步骤进行: 明确系统需求:首先明确系统的功能需求,包括短视频的上传、编辑、发布、播放等环节。确定系统的目标用户和主要的使用场景&#xff…

【数据结构】栈和队列-->理解和实现(赋源码)

Toc 欢迎光临我的Blog,喜欢就点歌关注吧♥ 前面介绍了顺序表、单链表、双向循环链表,基本上已经结束了链表的讲解,今天谈一下栈、队列。可以简单的说是前面学习的一特殊化实现,但是总体是相似的。 前言 栈是一种特殊的线性表&…

深入ES6:解锁 JavaScript 类与继承的高级玩法

个人主页:学习前端的小z 个人专栏:JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! ES5、ES6介绍 文章目录 💯Class🍟1 类的由来🍟2 co…

手把手Linux高可hadoop集群的搭建

高可用集群的搭建 在搭建高可用集群之前,如果搭建了完全分布式hadoop,先执行stop-all.sh停掉所有的服务,只保留jdk和zookeeper的2个服务,然后再去搭建。 目标: 高可用集群简介部署Hadoop高可用集群 一.…

java:spring cloud使用tcc-transaction实现分布式事务

# 安装tcc-transaction server和dashboard 参考这篇文章【https://changmingxie.github.io/zh-cn/docs/ops/server/deploy-alone.html】里面有mysql的建表脚本,先将数据库建好。 下载tcc-transaction cd /chz/install/tcc-transaction wget https://github.com/ch…

webgl_framebuffer_texture

ThreeJS 官方案例学习&#xff08;webgl_framebuffer_texture&#xff09; 1.效果图 2.源码 <template><div><div id"container"></div><div id"selection"><div></div></div></div> </templa…

嵌入式Linux系统编程 — 2.3 标准I/O库:格式化I/O

目录 1 格式化I/O简介 2 格式化输出 2.1 格式化输出函数简介 2.2 格式控制字符串 format 2.3 示例程序 3 格式化输入 3.1 格式化输入简介 3.2 格式控制字符串 format 3.3 示例程序 1 格式化I/O简介 在先前示例代码中&#xff0c;经常使用库函数 printf() 来输出程序中…

操作系统教材第6版——个人笔记6

3.3.4 页面调度 页面调度 当主存空间已满而又需要装入新页时&#xff0c;页式虚拟存储管理必须按照一定的算法把已在主存的一些页调出去 #主存满加新&#xff0c;把已在主存一些页调出选择淘汰页的工作称为页面调度 选择淘汰页的算法称为页面调度算法 页面调度算法设计不当&a…

【递归、搜索与回溯】递归、搜索与回溯准备+递归主题

递归、搜索与回溯准备递归主题 1.递归2.搜索3.回溯与剪枝4.汉诺塔问题5.合并两个有序链表6.反转链表7.两两交换链表中的节点8.Pow(x, n)-快速幂&#xff08;medium&#xff09; 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你…

解决Windows Hosts 文件因为权限无法修改的问题

如何修改 Windows Hosts 文件并添加域名映射 在日常工作中&#xff0c;可能需要修改 Windows 的 hosts 文件&#xff0c;以将特定的域名映射到指定的 IP 地址。本文介绍三种方法来完成这一任务&#xff1a;直接手动编辑 hosts 文件&#xff0c;使用批处理文件自动完成任务&…

哈默纳科Harmonic谐波减速机应用领域有哪些

在制造设备中&#xff0c;精确控制速度与位置的需求日益凸显&#xff0c;这为谐波减速机的广泛应用提供了广阔的舞台。哈默纳科Harmonic谐波减速机以结构紧凑、高精度、高刚度、高可靠性、便于安装维护等优势&#xff0c;在工业机器人和自动化系统中发挥着举足轻重的作用。 一、…

如何调用地方天地图?

我们在《如何申请自己的专属天地图&#xff1f;》一文中&#xff0c;为大家分享了如果申请专属天地图&#xff0c;并在水经微图&#xff08;以下简称“微图”&#xff09;中加载的具体方法。 于是&#xff0c;就有朋友问如何调地方用天地图。 现在&#xff0c;我们就以四川地…

六位一线AI工程师总结大模型应用摸爬滚打一年的心得,网友:全程高能!

六位一线AI工程师和创业者&#xff0c;把在大模型应用开发上摸爬滚打一整年的心得&#xff0c;全&#xff01;分&#xff01;享&#xff01;了&#xff01; &#xff08;奇怪的六一儿童节大礼包出现了&#xff09; 这篇干货长文&#xff0c;一时间成为开发者社区热议的话题。…

2024年几款优秀的SQL IDE优缺点分析

SQL 工具在数据库管理、查询优化和数据分析中扮演着重要角色。 以下是常见的 SQL 工具及其优缺点。 1. SQLynx 优点&#xff1a; 智能代码补全和建议&#xff1a;采用AI技术提供高级代码补全、智能建议和自动错误检测&#xff0c;大幅提高编写和调试SQL查询的效率。跨平台和…

蓝桥杯物联网竞赛_STM32L071_19_输出方波信号(PWM)

国赛考了一个方波&#xff0c;第一次考这个&#xff0c;连个示波器都没有 CUBMX配置&#xff1a; 按上述配置刚好是32MHZ / 32 / 100 10KHZ 理论&#xff1a; 频率&#xff1a;就是一秒钟能产生多少个脉冲&#xff0c;如下图: 这算是一个脉冲&#xff0c;1KHZ说明一秒钟产生…

源码发布Quantlab4.2,Deap因子挖掘|gplearn做不到的咱们也能做。(代码+数据)

原创文章第552篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 又到了星球发布代码的日子&#xff1a; 更新说明&#xff1a;1、Deap做因子挖掘的框架使用。值得说明的是&#xff0c;源码级别&#xff0c;并非产品级&#xff0c;不能指望输入一堆…

降噪是什么意思?视频如何降噪?一文了解全部

在视频制作的过程中&#xff0c;我们经常会遇到噪音问题&#xff0c;这些噪音可能来自拍摄环境、录制设备或其他源头。然而&#xff0c;对于初学者来说&#xff0c;降噪是什么意思&#xff0c;以及如何有效地在视频中进行降噪可能是一些疑惑的问题。本文将深入解释降噪的概念&a…

Mat的lambda方式像素高效遍历(C++11)

Mat的lambda方式像素高效遍历&#xff08;C11&#xff09; 文章目录 Mat的lambda方式像素高效遍历&#xff08;C11&#xff09;前言一、Mat的lambda方式像素高效遍历二、代码实现总结 前言 图像遍历是图像处理中的经典操作&#xff0c;快速高效的进行像素遍历对性能的提升至关…

[AI OpenAI] 提取GPT-4中的概念

总结&#xff1a; 研究人员采用新的可扩展方法&#xff0c;将GPT-4的内部表示分解为1600万个通常可解释的模式&#xff0c;这些模式被称为“特征”&#xff0c;目的是提高语言模型的透明度和可解释性。通过使用稀疏自编码器&#xff0c;研究人员能够识别与特定概念相关的特征&…

《今日科技》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《今日科技》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊 问&#xff1a;《今日科技》是什么级别的&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;浙江省科学技术厅 主办单位&#xff1a;浙江省…