RabbitMQ官方文档翻译第一部分 --- "Hello World"

注:如果你有更好的翻译可以留言,我会不定时立即更新翻译
如果你要转摘,请注明出处,谢谢

介绍

使用须知

如果你已经安装了RabbitMQ并且已
经运行在localhost:5672上。
如果使用了其它的ip(host),端口
(port),证书(credentials),连接设置(connections settings)则需要做相应的调整。

哪里获取帮助

如果你在看这份教程时遇到困难,可以通过发送mail 联系我们

RabbitMQ是一个消息中间件:它可以接收和发送消息。你可以把它想象成是一个邮局。当你把你要寄送的邮件放在一个邮筒里,你可以肯定邮递员最终会把邮件寄给你的收件人。在这个比喻中,RabbitMQ扮演着邮筒,邮局,邮递员的角色。
RabbitMQ和邮局的主要区别在于它不处理纸质信息,只接收、存储和转发二进制数据的信息。
RabbitMQ和一般的消息传递中使用了一些术语


    • 生产(Producing)无非就是发送信息. 发送消息的程序就是一个生产者(producer) :

    • RabbitMQ里有一个名为邮筒的队列。虽然消息在RabbitMQ和你的程序之间流通,但是它们只能存储在队列中。队列受限于主机内存和磁盘限制,它本质上是一个巨大的消息缓冲区。许多生产者(producers)可以发送消息到一个队列当中,并且许多消费者(consumers)会尝试从一个队列当中接收数据。这是我们表达队列的方式:

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

注意:生产者(producer),消费者(consumer),中间件(broker)不必在同一个主机上;实际上在大多数应用中它们都没有(在同一台主机上)。

"Hello World"

(使用Java客户端)

在本教程这个部分我们将用Java写2个程序;生产者(producer)发送单个消息,消费者(consumer)接收消息并打印。我们会掩饰Java API中一些细节,集中注意这个非常简单的事情才刚刚开始。这是一条“Hello World”的消息。

在下面的图表中,“P”代表生产者(producer),“C”代表消费者(consumer)。
中间的盒子是一个队列 --- RabbitMQ中消费者的消息缓冲区。
(P) -> [|||] -> (C)

Java客户端库
RabbitMQ 支持多种协议。本教程使用AMQP 0-9-1,它是一个开放,通用的消息传 递协议。这里有不同语言的

RabiitMQ客户端 。我们将会使用RabbitMQ提供的Java客 户端。
下载 客户端库 和它的依赖库( SLF4J API SLF4J Simple )。顺着教程复制这些Java文件到你的工作目录中。
请注意SLF4J Simple在教程中已经足够了,但你应该使用一个更全面的日志库,比 如 Logbak
(RabbitMQ Java客户端也在中央Maven仓库中, groupId " com.rabbitmq ",artifactId  " amqp-client ")

现在我们有Java客户端和它的依赖库。我们可以写一些代码了。

发送
(P) -> [|||]

我们将调用我们的消息发布者(publisher/sender) send.java 和消息消费者(consumer/receiver) Recv.java。发布者(publisher)将会连接到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 java.io.IOException {
      ...
  }
}    

然后我们可以创建到服务器的连接:
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();

这个连接抽象了socket 连接,并为我们负责协议版本协商和身份验证等。这里我们连接到本机的中间件上 - localhost。
如果我们想要在不同的机器上连接中间件,我们只需在此处指定其名称和IP地址。

接下来我们创建一个通道,它是大部分API获取任务的地方。

在send中,我们必须声明一个队列供我们发送;然后我们可以发布一个消息到队列里。
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 + "'");
声明队列是幂等 - 只有在它不存在的情况下才会创建它。消息内容是字节数组,因此你可以编码成你喜欢的内容。
最后,我们关闭通道和连接;
channel.close();
connection.close();

发送不起作用!
如果这是你第一次使用RabbitMQ并且你没有看到"Sent"的消息,那么你可能会被弄 得头晕目眩,想知道哪里错了。

可能是中间件没有足够的磁盘空间来启动(默认情况 下它至少需要200MB),因此拒绝接收消息。检查中间件日志文

件确认问题并在必要时减少限制。 配置文件文档 将向你展示如何设置 disk_free_limits属性

接收

这就是我们的发布者(publisher)。我们的消费者是来自RabbitMQ的推送消息,因此与发布单个消息的发布者不同,消费者将会持续运行和监听消息并将打印出来。
[|||] -> (C)

代码 ( Recv.java ) 和  Send 的import几乎一样 :
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;

额外的  DefaultConsumer  是一个实现了 Consumer  接口的类,我们将用它来缓冲服务器推送给我们的消息。

设置与发布者相同。我们打开一个连接和一个通道,并声明我们将要使用的队列。请注意这与发布(send) 的队列相匹配
public class Recv {
  private final static String QUEUE_NAME = "hello";

  public static void main(String[] argv)
      throws java.io.IOException,
             java.lang.InterruptedException {

    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");
    ...
    }
}

请注意,我们也在这里声明队列。因为我们可能会在发布者之前先开启消费者,所以我们希望在尝试使用消息之前先确保队列存在。

我们即将告诉服务器从消息队列中传递消息给我们(消费者)。因为它会异步地向我们推送消息,所以我们以对象的形式提供一个回调,它将缓冲消息直到我们准备好使用它们为止。这就是 DefaultConsumer子类的作用。
Consumer consumer = new DefaultConsumer(channel) {
  @Override
  public void handleDelivery(String consumerTag, Envelope envelope,
                             AMQP.BasicProperties properties, byte[] body)
      throws IOException {
    String message = new String(body, "UTF-8");
    System.out.println(" [x] Received '" + message + "'");
  }
};
channel.basicConsume(QUEUE_NAME, true, consumer);

把它们放在一起

你可以用classpath中的RabbitMQ Java客户端编译这2个类:
javac -cp amqp-client-4.0.2.jar Send.java Recv.java

要运行它们,你的classpath里需要 rabbitmq-client.jar和它的依赖库 。在终端中运行消费者(receiver):
java -cp .:amqp-client-4.0.2.jar:slf4j-api-1.7.21.jar:slf4j-simple-1.7.22.jar Recv

然后,运行发布者(sender):
java -cp .:amqp-client-4.0.2.jar:slf4j-api-1.7.21.jar:slf4j-simple-1.7.22.jar Send
在Windows上,使用冒号代替分号来分隔classpath中的jar。
消费者将会打印发布者推送到RabbitMQ上的消息。消费者会保持运行并等待消息(使用Ctrl + C 来阻止它),所以尝试在另一个终端上运行发布者。

展示队列

你可能希望看到RabbitMQ有多少队列以及它们有多少消息。
你(使用sudo权限) 可以使用 rabbitmqctl  工具执行下面的操作:
sudo rabbitmqctl list_queues

在Windows上省略 ‘sudo’:
rabbitmqctl.bat list_queues

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

友情提示

你可以设置一个环境变量来指定jar的路径。
export CP=.:amqp-client-4.0.2.jar:slf4j-api-1.7.21.jar:slf4j-simple-1.7.22.jar
java -cp $CP Send

在Windows上:
set CP=.;amqp-client-4.0.2.jar;slf4j-api-1.7.21.jar;slf4j-simple-1.7.22.jar
java -cp %CP% Send

猜你喜欢

转载自blog.csdn.net/qq171563857/article/details/81008405