您的位置:首页 > 编程语言 > Java开发

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

2018-01-17 15:07 435 查看

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 API和SLF4J Simple)。根据Java教程,将这些文件复制到您的工作目录中。
(RabbitMQ Java客户端也在中央Maven存储库中,groupId是com.rabbitmq和artifactId是amqp-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
f166
 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:
 

 
消息推送成功!
入门的“Hello World”到这里就结束了,下一篇我们将创建复杂一些的work queue模式。
原文地址:http://www.rabbitmq.com/tutorials/tutorial-one-java.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java RabbitMQ 消息队列