RabbitMQ简单入门实例

1.Windows下安装RabbitMQ

   (1):下载erlang,原因在于RabbitMQ服务端代码是使用并发式语言erlang编写的,下载地址:http://www.erlang.org/downloads,双击.exe文件进行安装就好,安装完成之后创建一个名为ERLANG_HOME的环境变量,其值指向erlang的安装目录,同时将%ERLANG_HOME%\bin加入到Path中,最后打开命令行,输入erl,如果出现erlang的版本信息就表示erlang语言环境安装成功;



(2):下载RabbitMQ,下载地址:http://www.rabbitmq.com/,同样双击.exe进行安装就好;

(3):安装RabbitMQ-Plugins,这个相当于是一个管理界面,方便我们在浏览器界面查看RabbitMQ各个消息队列以及exchange的工作情况,安装方法是:打开命令行cd进入rabbitmq的sbin目录(我的目录是:E:\software\rabbitmq\rabbitmq_server-3.6.5\sbin),输入:rabbitmq-plugins enable rabbitmq_management命令,稍等会会发现出现plugins安装成功的提示,默认是安装6个插件,如果你在安装插件的过程中出现了下面的错误:


解决方法:使用搜索文件工具(Everything)查找.erlang.cookie文件,将Windows文件下的.erlang.cookie文件copy到"User\用户名"目录,然后打开rabbitmq_server-3.6.5\sbin>rabbitmq-plugins enable rabbitmq_management,当看到Applying plugin configuration to [email protected] nothing to do.这时rabbitmq_server服务已经完成。

(4):插件安装完之后,在浏览器输入http://localhost:15672进行验证,你会看到下面界面,输入用户名:guest,密码:guest你就可以进入管理界面,当然用户名密码你都可以变的;


2.安装完RabbitMQ之后,简单了解下RabbitMQ中涉及到的几个概念

    producer:消息生产者

    consumer:消息消费者

     virtual host:虚拟主机,在RabbitMQ中,用户只能在虚拟主机的层面上进行一些权限设置,比如我可以访问哪些队列,我可以处理哪些请求等等;

     broker:消息转发者,也就是我们RabbitMQ服务端充当的功能了,那么消息是按照什么规则进行转发的呢?需要用到下面几个概念;

     exchange:交换机,他是和producer直接进行打交道的,有点类似于路由器的功能,主要就是进行转发操作的呗,那么producer到底用哪个exchange进行路由呢?这个取决于routing key(路由键),每个消息都有这个键,我们也可以自己设定,其实就是一字符串;

     queue:消息队列,用于存放消息,他接收exchange路由过来的消息,我们可以对队列内容进行持久化操作,那么queue到底接收那个exchange路由的消息呢?这个时候就要用到binding key(绑定键)了,绑定键会将队列和exchange进行绑定,至于绑定方式,RabbitMQ提供了多种方式,大家可以看看网上各种方式。以上就是RabbitMQ涉及到的一些概念了,用一张图表示这些概念之间的关系就是:


3.RabbitMQ简单使用

   Producer(生产者)端步骤:

    (1):创建ConnectionFactory,并且设置一些参数,比如hostname,portNumber等等

    (2):利用ConnectionFactory创建一个Connection连接

    (3):利用Connection创建一个Channel通道

    (4):创建queue并且和Channel进行绑定

    (5):创建消息,并且发送到队列中

     注意,在我们当前的例子中,并没有用到exchange交换机,RabbitMQ默认情况下是会创建一个空字符串名字的exchange的,如果我们没有创建自己的exchange的话,默认就是使用的这个exchange;

jar如下:amqp-client-5.2.0.jar  rabbitmq-client-1.3.0.jar

Producer端代码:

package com.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;
/**
 * RabbitMQ 生产者
 * @author Administrator
 * 
 */
public class Producer {
//队列名称
private final static String QUEUE_NAME = "Queue";
public static void main(String[] args) {
// 创建连接工厂
ConnectionFactory factory = null;
// 建立到代理服务器到连接
Connection connection = null;
// 获得通道
Channel channel = null;
try {
factory = new ConnectionFactory();
//设置用户名和密码
factory.setUsername("guest");
factory.setPassword("guest");
// 设置 RabbitMQ 地址
factory.setHost("localhost");
// 建立到代理服务器到连接
connection = factory.newConnection();
channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "hello world .....";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
System.out.println("发送  message[" + message + "] to "+ QUEUE_NAME +" success!");  
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
} finally {
try {
// 关闭资源
channel.close();
connection.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
}
}

Producer运行结果如下:

发送  message[hello world .....] to Queue success!

Consumer(消费者)端步骤:

     (1):创建ConnectionFactory,并且设置一些参数,比如hostname,portNumber等等

     (2):利用ConnectionFactory创建一个Connection连接

     (3):利用Connection创建一个Channel通道

     (4):将queue和Channel进行绑定,注意这里的queue名字要和前面producer创建的queue一致

     (5):创建消费者Consumer来接收消息,同时将消费者和queue进行绑定

package com.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;
import com.rabbitmq.client.QueueingConsumer;
import com.rabbitmq.client.QueueingConsumer.Delivery;
import com.rabbitmq.client.ShutdownSignalException;
/**
 * RabbitMQ 消费者
 * @author Administrator
 *
 */
public class Consumer {
//队列名称
private final static String QUEUE_NAME = "Queue";
public static void main(String[] args) {
// 创建连接工厂
ConnectionFactory factory = null;
// 建立到代理服务器到连接
Connection connection = null;
// 获得通道
Channel channel = null;
try {
factory = new ConnectionFactory();
factory.setUsername("guest");
factory.setPassword("guest");
factory.setHost("localhost");
// 建立到代理服务器到连接
connection = factory.newConnection();
channel = connection.createChannel();
// 1.队列名2.是否持久化,3是否局限与链接,4不再使用是否删除,5其他的属性
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 声明一个消费者,配置好获取消息的方式
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume(QUEUE_NAME, true, consumer);
// 循环获取消息
while (true) {
// 循环获取信息
// 指向下一个消息,如果没有会一直阻塞
Delivery delivery = consumer.nextDelivery();
String msg = new String(delivery.getBody());
System.out.println("接收 message[" + msg + "] from " + QUEUE_NAME);
}
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
} catch (ShutdownSignalException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
try {
// 关闭资源
channel.close();
connection.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
}
}

Consumer运行结果如下:

接收 message[hello world .....] from Queue

4.RabbitMQ服务器web端(http://localhost:15672)

RabbitMQ服务器http://localhost:15672查看相关信息