RabbitMQ文档翻译一(JAVA).Hello World!

2024-08-26 09:08

本文主要是介绍RabbitMQ文档翻译一(JAVA).Hello World!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

RabbitMQ是一个消息代理:它接受和转发消息。你可以把它想象成一个邮局:当你把你想寄出的邮件放进一个邮箱里时,你可以确信邮件的收件人最终会收到邮件。类似的,RabbitMQ是一个邮箱、一个邮局和一个邮递员。

RabbitMQ与邮局的主要区别在于,它不处理纸张信件,而是接受、存储和转发二进制的数据信息块。

RabbitMQ和消息传递通常使用一些行业术语

  • 生产只意味着发送。发送消息的程序是生产者:

    img

  • queue是RabbitMQ中的邮箱的名称。尽管消息流经RabbitMQ和您的应用程序,但它们只能存储在队列中。队列只受主机的内存和磁盘限制的约束,它本质上是一个大的消息缓冲区。许多生产者可以将消息发送到一个队列,而许多消费者可以尝试从一个队列接收数据。如下是我们表示队列的方式

    img

  • 消费和接收有着相似的含义。消费者是一个主要等待接收消息的程序:

    img

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

“Hello World”

在这部分中,我们将用Java编写两个程序:一个是发送单个消息的生产者,另一个是接收消息并将其打印出来的消费者。我们将略过Java API中的一些细节,重点放在这件非常简单的事情上,以便于快速开始上手。一个“Hello World”消息。

在下图中,“P”是我们的生产者,“C”是我们的消费者。中间的框是一个队列,是RabbitMQ持有的供消费者使用的的消息缓冲区。

(P) -> [|||] -> (C)

Java客户端库
RabbitMQ有多种协议。本教程使用AMQP 0-9-1,这是一个开放的、通用的消息传递协议。RabbitMQ有许多不同语言的客户机。我们将使用RabbitMQ提供的Java客户端。

下载客户端库及其依赖项(SLF4J API和SLF4J Simple)。将这些文件与教程中的Java文件一起复制到工作目录中。

请注意,SLF4J Simple对于教程来说已经足够了,但是您应该在生产中使用完整的日志库,比如Logback。

(RabbitMQ Java客户端也在中央Maven存储库中,groupId为com.rabbitmq,artifactId为amqp-client.)

现在我们有了Java客户端及其依赖项,我们可以编写一些代码。

发送

(P) -> [|||]

我们将调用我们的消息发布者(sender)发送和消息使用者(receiver)接收。发布者将连接到RabbitMQ,发送一条消息,然后退出。
在 Send.java,我们需要导入一些类:

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()) {}

该连接抽象了socket连接,为我们负责协议版本协商和认证等工作。在这里,我们连接到本地机器上的RabbitMQ节点-因此是本地主机。如果我们想连接到另一台机器上的节点,我们只需在这里指定它的主机名或IP地址。

接下来,我们创建一个通道,这是大多数完成任务的API所在的位置。注意,我们可以使用try-with-resources语句,因为连接Connection和通道Channel都实现了java.io.Closeable. 这样我们就不需要在代码中显式地关闭它们。

要发送,我们必须声明要发送到的队列;然后我们可以将消息发布到队列,所有这些都在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 + "'");

声明队列是等幂的——只有当它不存在时才会创建它。消息内容是一个字节数组,因此您可以在那里对任何您喜欢的内容进行编码。

这里是完整的Send.java类.

发送不起作用!

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

接收

这是我们的发布者。我们的消费者监听来自RabbitMQ的消息,因此与发布单个消息的发布者不同,我们将保持它的运行以监听消息并将其打印出来。

[|||] -> (C)

代码(在 Recv.java 中)与Send有几乎相同的import:

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

我们将使用额外的DeliveryCallback接口来缓冲服务器推送到我们的消息。
设置与发布服务器相同;我们打开一个连接和一个通道,并声明要使用的队列。注意,这与send发布消息的队列是匹配的。

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 -> { });

这是完整的Recv.java类

整合

您可以使用类路径上的RabbitMQ java客户端编译这两个文件:

javac -cp amqp-client-5.7.1.jar Send.java Recv.java

要运行它们,您需要rabbitmq-client.jar以及它对类路径的依赖关系。在终端中,运行消费者(receiver):

java -cp .:amqp-client-5.7.1.jar:slf4j-api-1.7.26.jar:slf4j-simple-1.7.26.jar Recv

然后,运行生产者(sender):

java -cp .:amqp-client-5.7.1.jar:slf4j-api-1.7.26.jar:slf4j-simple-1.7.26.jar Send

在Windows上,使用分号而不是冒号分隔类路径中的项。
消费者将通过RabbitMQ打印从生产者处获得的消息。消费者将继续运行,等待消息(使用Ctrl-C停止),因此尝试从另一个终端运行发布服务器。

列出队列
您可能希望看到RabbitMQ有哪些队列以及其中有多少消息。您可以使用rabbitmqctl工具(作为特权用户)执行此操作:

sudo rabbitmqctl list_queues

在Windows上,省略sudo:

rabbitmqctl.bat list_queues

是时候进入第2部分并构建一个简单的工作队列了。

提示
为了节省输入,您可以为类路径设置一个环境变量,例如。

export CP=.:amqp-client-5.7.1.jar:slf4j-api-1.7.26.jar:slf4j-simple-1.7.26.jar
java -cp $CP Send

在Windows上:

set CP=.;amqp-client-5.7.1.jar;slf4j-api-1.7.26.jar;slf4j-simple-1.7.26.jar
java -cp %CP% Send

这篇关于RabbitMQ文档翻译一(JAVA).Hello World!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2