服务环境:Centos 7
客户端环境:windows、 IDEA、Java
1.1.0、安装Erlang:
wget http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
rpm --import http://packages.erlang-solutions.com/rpm/erlang_solutions.asc
yum install erlang
安装好后输入 erl命令确认是否安装成
1.2.0、安装RabbitMQ
下载源码包(可能有点慢)
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.18/rabbitmq-server-3.7.18-1.el7.noarch.rpm
rpm -ivh rabbitmq-server-3.7.18-1.el7.noarch.rpm
执行上面这条命令如果出现如下图错误:
1.2.1、解决方法:
yum -y install socat
执行成功后,返回到上面安装 rpm -ivh rabbitmq-server-3.7.18-1.el7.noarch.rpm
1.2.2、启动、停止、重新启动
service rabbitmq-server start
service rabbitmq-server stop
service rabbitmq-server restart
1.2.3、设置开机自启
chkconfig rabbitmq-server on
1.2.4、开启web界面管理工具
rabbitmq-plugins enable rabbitmq_management
service rabbitmq-server restart
1.2.5、开启用户远程访问
vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.7.18/ebin/rabbit.app
将:{loopback_users, [<<”guest”>>]},
改为:{loopback_users, []},
改后如下图:
再重启rabbitmq:
service rabbitmq-server restart
1.2.6、登录管理页面
在浏览器访问服务器15672端口登录管理界面:
使用RabbitMQ默认的用户和密码登录:
用户:guest
密码:guest
登录成功后的管理界面:
1.3.0、添加用户
Tags:角色
RabbitMQ各类角色描述:
1、超级管理员(administrator)
可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。
2、监控者(monitoring)
可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
3、策略制定者(policymaker)
可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。
4、普通管理者(management)
仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。
5、其他
无法登陆管理控制台,通常就是普通的生产者和消费者。
1.4.0、创建Virtual Hosts
1.5.0、为用户设置权限
点击用户名进到如下页面
查看已经添加的权限:
1.6.0、简单队列的实现
新建一个maven项目用来测试目录如下:
实现队列图示:
P:生产者
C:消费者
共色格子为队列
1.6.1、导入RabbitMQ的客户端依赖
com.rabbitmq
amqp-client
3.4.1
1.6.2、获取MQ的连接(ConnectionUtil.java)
package com.test.mq;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
public class ConnectionUtil {
//获取MQ连接
public static Connection getConnection() throws Exception{
//定义连接工厂
ConnectionFactory factory = new ConnectionFactory();
//MQ所在主机的ip
factory.setHost("localhost");
//MQ所在端口
factory.setPort(5672);
//设置账号信息,虚拟主机,用户名,密码
factory.setVirtualHost("testHost");
factory.setUsername("testUser");
factory.setPassword("123456");
//通过工厂获取连接
Connection connection = factory.newConnection();
return connection;
}
}
1.6.3、生产者发送消息到队列(send.java)
package com.test.mq;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import java.util.Scanner;
public class Send {
//队列名称
private final static String QUEUE_NAME ="test_01";
public static void main(String[] args) throws Exception {
//获取连接
Connection connection = ConnectionUtil.getConnection();
//从连接中创建通道
Channel channel = connection.createChannel();
//声明队列
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
Scanner sc = new Scanner(System.in);
System.out.println("请输入消息内容按回车键发送消息!输入Q按回车键退出。");
//发送的消息
String message = sc.next();
while (!message.equals("q")){
//把消息发送到队列中
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println("消息发送成功!");
System.out.println("请输入消息内容按回车键发送消息!输入Q按回车键退出。");
message = sc.next();
}
//关闭通道和连接
channel.close();
connection.close();
System.out.println("队列已关闭");
}
}
运行后输入消息到队列中:
1.6.4、打开管理界面查看队列中的消息情况
点击队列名进去:
可以看到发送到队列中的消息,如果被消费者消费之后消息就不在了,接下来写个消费者从队列获取(消费)消息。
1.6.5、消费者从队列中获取消息(Receive.java)
package com.test.mq;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.QueueingConsumer;
public class Receive {
//队列名称
private final static String QUEUE_NAME = "test_01";
public static void main(String[] args) throws Exception {
//获取连接
Connection connection = ConnectionUtil.getConnection();
//从连接中创建通道
Channel channel = connection.createChannel();
//声明队列
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
//定义队列的消费者
QueueingConsumer consumer = new QueueingConsumer(channel);
//监听队列
channel.basicConsume(QUEUE_NAME,true,consumer);
//循环获取消息
while (true){
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
System.out.println("接收到的消息:"+message);
//休眠1秒
Thread.sleep(1000);
}
}
}
运行消费者获取消息:
到此一个简单的消息队列已经实现,能力有限,内容仅供自己查阅。