消息队列做为开发中经常使用的中间件,主要应用于处理削峰、异步、解耦等场景。RabbitMQ因其使用简单,配置灵活,管理方便而广受使用。为了方便小白快速入门,课表明翻译了官方教程原文供你们参考,如下为其第一篇:“Hello World”
介绍java
RabbitMQ 是一个消息代理(message broker):它接收并转发消息。你能够把它想象成邮局,当你把要发送的信件放到邮箱里时,你能够确信某位邮递员最终会将你的信件投递给接收人。在这个类比中,RabbitMQ 就是邮箱+邮局+邮递员git
RabbitMQ 和邮局的主要区别是,它不处理纸质信件,取而代之的是,它接收、存储并转发二进制数据——消息(message)github
RabbitMQ 和消息投递中,用到了以下术语:编程
生产者,消费者和消息代理不必在同一台主机上,实际上在大多数应用场景中,三者都在不一样的机器上。一个应用既能够是生产者,也能够是消费者。segmentfault
(Java 代码实现)api
在这部分教程中,咱们将会编写两个 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 客户端和依赖库,能够写点代码了。
咱们把消息发布者(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
完成。因为 Connection
和channel
都实现了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 + "'");
声明队列操做是幂等的——也就是说只有当声明的队列不存在时才会建立。消息内容是字符数组,从而能够对任意内容进行编码。
接收(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
接口来缓存服务端发给咱们的消息。
配置代码和发布者同样:建立connection
和channel
,声明须要从哪一个队列(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 语句来自动关闭channel
和 connection
呢?若是这样写,至关于让程序继续往下执行,关闭全部资源而后退出应用!而咱们的目的是但愿应用一直存活,持续地异步监听消息。
接下来咱们将告知服务器将 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 -> { });
只须要把 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_queuesWindows系统下省略 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 SendWindows下:
set CP=.;amqp-client-5.7.1.jar;slf4j-api-1.7.26.jar;slf4j-simple-1.7.26.jar java -cp %CP% Send
推荐阅读
码字不易,欢迎点赞分享。
搜索:【Java课表明】,关注公众号,及时获取更多Java干货。