因为公司的一个客服系统用到了rabbitmq消息队列,所以笔者想深入学习一下,给大家一起分享下。
其实,jdk里面也有队列相关的类,例如LinkedBlockQueue。但是在实现持久化,跨应用之前存在很大的障碍,所以使用一些成熟的消息队列组件便能带来不错的效果。
rabbitmq有几个概念需要记住,如下:
Exchange:交换机,决定了消息路由规则;
Queue:消息队列;
Channel:进行消息读写的通道;
Bind:绑定了Queue和Exchange,意即为符合什么样路由规则的消息,将会放置入哪一个消息队列。
下面,笔者将分以下几个步骤进行介绍:
一、环境安装
这里,为了学习的方便,笔者选择windows版本进行安装学习。首先,因为RabbitMQ由ERLANG实现,所以需要先安装ERLANG环境,下载地址:http://erlang.org/download/otp_win64_R15B.exe,rabbitmq的下载地址如下:http://220.112.194.135:9011/www.rabbitmq.com/c3pr90ntc0td/releases/rabbitmq-server/v3.3.4/rabbitmq-server-3.3.4.exe
然后,安装完成后,进入到rabbitmq安装目录的sbin目录下,执行:rabbitmq-server -detached
,然后再执行:rabbitmq-plugins enable rabbitmq_management
, 这样rabbitmq服务启动成功并且可以通过web控制台查看了。
接下来,我们添加一个管理员用户,执行:rabbitmqctl add_user admin 888888
,再执行:abbitmqctl set_user_tags admin administrator
,然后就可以通过访问:http://127.0.0.1:15672/,使用刚创建的用户进行登录了。
接下来,我们单击Admin,进入配置页面,配置虚拟主机读取权限,如下:
保存后,可看到如下:
另外,rabbitmq的一些常用命令如下:
启动: ./rabbitmq-server -detached
关闭: ./rabbitmqctl stop
查看: ./rabbitmqctl status
二、一个简单的java示例
其实,rabbitmq使用起来还是挺简单的,无非是一边生产者进行生产(入队列),另一边消费者就行消费(出队列);
首先,pom依赖如下:
<!-- RabbitMq客户端 -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.3.4</version>
</dependency>
然后,消费者HelloProducer如下:
/**
* Project Name:qyk_testJava
* File Name:HelloProducer.java
* Package Name:com.qiyongkang.mq.rabbitMq.producer
* Date:2017年2月21日下午3:12:21
* Copyright (c) 2017, Thinkive(http://www.thinkive.com/) All Rights Reserved.
*
*/
package com.qiyongkang.mq.rabbitMq.producer;
import java.io.IOException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* ClassName:HelloProducer <br/>
* Function: 生产者. <br/>
* Date: 2017年2月21日 下午3:12:21 <br/>
* @author qiyongkang
* @version
* @since JDK 1.6
* @see
*/
public class HelloProducer {
//队列名称
private final static String QUEUE_NAME = "qyk.hello";
public static void main(String[] args) throws IOException {
// 创建连接连接到MabbitMQ
ConnectionFactory factory = new ConnectionFactory();
//设置MabbitMQ所在主机ip或者主机名
factory.setHost("localhost");
//创建一个连接
Connection connection = factory.newConnection();
//创建一个频道
Channel channel = connection.createChannel();
//指定一个队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
//发送的消息
String message = "hello world!";
//往队列中发出一条消息
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println("生产一条消息:" + message);
//关闭频道和连接
channel.close();
connection.close();
}
}
这里,我们放入了一个hello world到qyk.hello这个队列,执行完毕后,可以在web控制台看到,如下:
然后,消费者HelloConsumer如下:
/**
* Project Name:qyk_testJava
* File Name:HelloProducer.java
* Package Name:com.qiyongkang.mq.rabbitMq.producer
* Date:2017年2月21日下午3:12:21
* Copyright (c) 2017, Thinkive(http://www.thinkive.com/) All Rights Reserved.
*
*/
package com.qiyongkang.mq.rabbitMq.producer;
import java.io.IOException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* ClassName:HelloProducer <br/>
* Function: 生产者. <br/>
* Date: 2017年2月21日 下午3:12:21 <br/>
* @author qiyongkang
* @version
* @since JDK 1.6
* @see
*/
public class HelloProducer {
//队列名称
private final static String QUEUE_NAME = "qyk.hello";
public static void main(String[] args) throws IOException {
// 创建连接连接到MabbitMQ
ConnectionFactory factory = new ConnectionFactory();
//设置MabbitMQ所在主机ip或者主机名
factory.setHost("localhost");
//创建一个连接
Connection connection = factory.newConnection();
//创建一个频道
Channel channel = connection.createChannel();
//指定一个队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
//发送的消息
String message = "hello world!";
//往队列中发出一条消息
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println("生产一条消息:" + message);
//关闭频道和连接
channel.close();
connection.close();
}
}
这里,我们启动消费者,只要队列里面有数据,便会立即进行消费;如果队列是空的,消费者便会进入阻塞状态,直到有数据入此队列。
好了,今天就简单的介绍到这儿了~