RabbitMQ Java官方教程(一)----Hello World

RabbitMQ Java官方教程(一)----Hello World

RabbitMQ 基础教程

简介

RabbitMQ是一个消息代理:它接收和转发消息。你可以将它想成一个邮局:当你把你想要的邮件放到邮箱里时,你可以确定邮差先生最终会把邮件寄给你的收件人。在这个类比中,RabbitMQ是邮筒、邮局和邮差。

RabbitMQ 和邮局之间最主要的区别是他不处理纸张。相反,它接收、储存和转发数据的二进制字段--消息(message)。

对应一般的消息传递,RabbitMQ使用了一些术语:

生产就是指发送。发送消息的程序就是生产者:

                                                               

  位于RabbitMQ内部的“邮箱”叫做队列。虽然消息是在RabbitMQ和你的程序之间交互,但消息只能是存储在队列中。队列只受主机的内存和磁盘限制约束,它本质上是一个大型的消息缓冲区。多个生产者可以发送消息到同一个队列,并且多个消费者可以从同一个队列接收消息。下面是我们表示队列的方式:

                                                         

消费和接收是相同的意思。一个主要是等待接收消息的程序是消费者:

                                                               

注意:生产者,消费者和代理不需要同属于一个主机;事实上,在大多的应用程序中他们都是不在同一主机的。

 

Hello World!

(使用Java 客户端)

 

在本次教程中,我们将用Java编写两个程序:一个用于发送简单信息的生产者,和一个接收消息并打印出来的消费者。我们将对Java API中的一些细节进行解析注释,做这个非常简单的事儿,仅仅是为了入门。这是消息传递的“Hello World”。

 

在下图中,“P”是我们的生产者,“C”是我们的消费者。中间的方框是一个队列——一个RabbitMQ为消费者储存消息的消息缓存区。

                                

Java 客户端库

RabbitMQ支持多种协议。本教程使用AMQP 0-9-1,这是一种开放的、通用的消息传递协议。有许多不同语言的RabbitMQ客户端。我们将使用RabbitMQ提供的Java客户机。下载客户端库及其依赖(SLF4J APISLF4J Simple)根据Java教程,将这些文件复制到您的工作目录中。

(RabbitMQ Java客户端也在中央Maven存储库中,groupIdcom.rabbitmqartifactIdamqp-client)

 

现在我们有了Java客户端和它的相关依赖,我们可以开始写代码了

 

发送过程

                                                  

我们将调用消息发布者(发送者)“发送”并且让我们的消费者(接收者)“接收”。发布者将连接到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();

连接为我们抽象了套接字连接,并且处理了协议版本的调用和验证等。这里,我们连接到本地机器的代理,因此是localhost”。如果我们想要连接到另一台机器上的代理,我们只需在这里指定它的域名IP地址。

接下来我们创建一个通道,它是大多数用于完成任务的API所在的地方。

为了发送,我们必须声明一个队列供我们发送;然后我们可以将消息发布到队列: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推送的消息,因此不像推送单个消息的发布者,我们需要保持消费者处于运行状态来监听消息,并且打印出来。               

这里的代码(在Recv.java中的)和Send.java中的引用几乎一样: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);

 完整代码

这里就不介绍使用命令行编译文件的方式了,我们使用Idea作为开发工具(当然使用别的也可以)。

先运行消费者(Recv),然后运行生产者(Send),得到输出为:

Send:

    

Recv:

 RabbitMQ Java官方教程(一)----Hello World_第1张图片 

消息推送成功!

入门的Hello World”到这里就结束了,下一篇我们将创建复杂一些的work queue模式。

原文地址:http://www.rabbitmq.com/tutorials/tutorial-one-java.html


RabbitMQ Java官方教程(一)----Hello World_第2张图片

你可能感兴趣的:(官方文档翻译,Java,RabbitMQ,消息队列)