本系列主要是通过翻译RabbitMQ官方文档来学习其基础知识。本篇是第一篇,利用RabbitMQ完成最简单的工作。

一、准备工作

1.RabbitMQ下载地址:http://www.rabbitmq.com/install-windows.html

           注意:需要先下载安装Erlang,然后才能安装RabbitMQ,默认地址为localhost,端口为5672

           安装完成后,可通过浏览器访问http://localhost:15672/检测是否安装成功。

二、简介

      RabbitMQ 是一个消息掮客,它负责接收消息并转发消息。你可以把它想象成是一个邮箱:当你把要邮寄的信件放入到邮箱中,你可以肯定邮递员最终会把信件投递到目的地。在这个类比中,RabbitMQ为了帮我们传达信息,就充当了邮箱,邮局和邮递员三者的角色。RabbitMQ和邮局最大的不同在于,RabbitMQ接受,存储和转发的信息是二进制的数据块而不是纸质信件。

      RabbitMQ在消息传送中使用的专业术语:

              生产者(Producer)就是消息的发送者,发送信息的程序就是生产者。

                                                                                        

rabbitmq 国内镜像下载_Java

              队列(queue)类似于是RabbitMQ中的邮箱名称。虽然消息在RabbitMQ和你的应用程序之间传递,但它只能被保存在队列中。队列只受主机的内存大小和硬盘大小的限制,否则可以无限增加。本质上说,队列就是一个巨大的消息缓存。多个生产者可以给一个队列发送消息,多个消费者可以从同一个队列中获取消息。

                                                                                       

rabbitmq 国内镜像下载_rabbitmq 国内镜像下载_02


              消费就是接收的意思。消费者就是大部分时间都在等待接收消息的程序。

                                                                                          

rabbitmq 国内镜像下载_Java_03

             注意:生产者(producer),消费者(consumer),掮客(broker)三者可以分别部署在不同的主机上。

三、一个简单的实验程序

下载client jar包,下载地址:点击打开链接

生产者(Producer)端程序:

package com.zyh.RabbitMQ;


import java.io.IOException;
import java.util.concurrent.TimeoutException;


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


public class Send {
 private final static String QUEUE_NAME="hello";
 public static void main(String[] args) throws IOException, TimeoutException{
 //建立publisher-broker的连接
 ConnectionFactory factory=new ConnectionFactory();
 //这里连接的是本地broker,因此host是localhost
 factory.setHost("localhost");
 //connection 抽象化了套接字连接,并且为我们处理了协议版本协商与认证等
 Connection connection=factory.newConnection();
 //创建channel对象,它将要完成大部分的工作
 Channel channel=connection.createChannel();
 
 //因为我们需要将信息发送到一个queue中,所以我们先要声明一个queue
 //申明一个queue具有幂等性,只有在其不存在的情况下才会被创建
 channel.queueDeclare(QUEUE_NAME,false,false,false,null);
 String message="Hello World!";
 //message被转换成了字节数组,所以你可以选择任意编码格式
 channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
 System.out.println("[x] Sent '"+message+"'");
 //关闭通道,关闭连接
 channel.close();
 connection.close();
 
 
 }
}



消费者端(Consumer)程序:

package com.zyh.RabbitMQ;


import java.io.IOException;
import java.util.concurrent.TimeoutException;


import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
public class Recv {
 private final static String QUEUE_NAME="hello";
 public static void main(String[] args) throws IOException, TimeoutException{
 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 ");
 //我们需要告知服务将相应的queue里的信息投递给我们
 //因为broker会异步的将信息投递给我们,所以我们需要以一个对象的形式提供一个回调,利用这个对象在我们使用这些信息之前缓存信息
 //这就是 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);
     System.out.println("666666666666");//证明消费端是非阻塞的
 }}

四、总结

    通过这篇教程,我们知道了RabbitMQ的作用以及它是如何工作的。