关于java:RabbitMQ教程-1Hello-World

3次阅读

共计 4312 个字符,预计需要花费 11 分钟才能阅读完成。

音讯队列作为开发中罕用的中间件,次要利用于解决削峰、异步、解耦等场景。RabbitMQ 因其应用简略,配置灵便,治理不便而广受应用。为了不便小白疾速入门,课代表翻译了官网教程原文供大家参考,以下为其第一篇:“Hello World”

1 “Hello World”

介绍

RabbitMQ 是一个音讯代理(message broker):它接管并转发音讯。你能够把它设想成邮局,当你把要发送的函件放到邮箱里时,你能够确信某位邮递员最终会将你的函件投递给接管人。在这个类比中,RabbitMQ 就是邮箱 + 邮局 + 邮递员

RabbitMQ 和邮局的次要区别是,它不解决纸质函件,取而代之的是,它接管、存储并转发二进制数据——音讯(message)

RabbitMQ 和音讯投递中,用到了如下术语:

  • 生产 (Producing) 就是发送。发送音讯的程序就是生产者:

  • 队列就是 RabbitMQ 里的邮箱。只管音讯从 RabbitMQ 流向你的利用,但音讯只能存储在队列中。队列受限于宿主机的内存和硬盘大小,它的实质是一个微小的音讯缓冲。生产者们能够发送音讯给队列,消费者们能够从队列接管音讯。队列可用下图示意:

  • 生产 (Consuming) 就是接管音讯。消费者是期待接管音讯的程序:

生产者,消费者和音讯代理没必要在同一台主机上,实际上在大多数利用场景中,三者都在不同的机器上。一个利用既能够是生产者,也能够是消费者。

“Hello World”

(Java 代码实现)

在这部分教程中,咱们将会编写两个 Java 利用:生产者用于发送单条音讯,消费者用于接管音讯并打印收到的音讯。咱们将会具体介绍几个 Java API,用于实现这个简略的性能。这就是音讯发送界的 “Hello World”。

下图中,“P”是生产者,“C”是消费者,两头的红框是队列——RabbitMQ 为消费者提供的音讯缓冲区。

Java 库

RabbitMQ 反对多种协定,本教程应用 AMQP 0-9-1, 它是开源、通用的音讯发送协定。RabbitMQ 的客户端反对多种编程语言。本文应用 RabbtiMQ 提供的 Java 客户端。

下载相应 Java 库和相干依赖 (SLF4J API 和 SLF4J Simple)。把文件复制到工作目录中。

须要留神的是,SLF4J Simple 仅用于教程演示,生产环境请应用全功能日志记录类库,如: Logback

(RabbitMQ 的 Java 客户端也在 Maven 仓库中提供,groupId:com.rabbitmq,artifactId:amqp-client)

当初有了 Java 客户端和依赖库,能够写点代码了。

发送(Sending)

咱们把音讯发布者 (sender) 类命名为 Send,音讯消费者(receiver) 命名为 Recv。发布者将会连贯到 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()) {}

Connection 类封装了 socket 连贯,并替咱们解决协定版本协商和认证等工作。这里咱们连贯到了本机的 RabbitMQ 节点——因为连贯地址写的是 localhost

如果想连贯到其余机器节点,只须要指定主机名或者 IP 地址即可。

接下来创立 channel,API 的所有工作都依赖于 channel 实现。因为 Connectionchannel 都实现了java.io.Closeable,咱们能够应用 try-with-resource 语句,避免显式编写敞开代码。

要发送音讯,须要申明一个队列 (queue) 作为指标;而后把音讯发送给这个队列,所有代码能够写到 try-with-resource 语句中

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 源文件

接管(Receiving)

下面介绍的是发布者。咱们的消费者要从 RabbitMQ 监听音讯,与发布者每次发送单个音讯不同,消费者会始终运行并监听音讯,而后把监听到的音讯打印进去。

Recv.java 中的援用 和 Send一样:

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

咱们将应用 DeliverCallback 接口来缓存服务端发给咱们的音讯。

配置代码和发布者一样:创立 connectionchannel,申明须要从哪个队列 (queue) 生产音讯。这里要和发布者的 queue 绝对应。

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 语句来主动敞开channelconnection 呢?如果这样写,相当于让程序持续往下执行,敞开所有资源而后退出利用!而咱们的目标是心愿利用始终存活,继续地异步监听音讯。

接下来咱们将告知服务器将 queue 里的音讯发送过去。因为服务器异步给咱们推送音讯,咱们提供一个对象模式的回调用来缓存音讯,直到音讯可用。这就是 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 源文件

代码整合(Putting it all together)

只须要把 RabbitMQ java 客户端代码放在 classpath 下,你就能够编译这俩文件:

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 有哪些队列(queue),每个队列里有多少音讯。

能够通过 rabbitmqctl 工具查看:

sudo rabbitmqctl list_queues

Windows 零碎下省略 sudo:

rabbitmqctl list_queues

接下来咱们学习第二局部,建设一个简略的工作队列。

小提示

为了缩短命令,能够给这些类门路设置环境变量

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

举荐浏览

Freemarker 教程(一)- 模板开发手册

下载的附件名总乱码?你该去读一下 RFC 文档了!


码字不易,欢送点赞分享。
搜寻:【Java 课代表】,关注公众号,及时获取更多 Java 干货。

正文完
 0