RabbitMQ是基于erlang环境,所以需要官网下载对应64位的安装包
然后下载RabbitMQ的.exe的可执行文件
配置erlang的环境变量(同jdk配置方式相同)
RabbitMQ’s Management Plugin
打开命令窗口:
进入RabbitMQ安装目录的sbin下
输入命令:
rabbitmq-plugins.bat" enable rabbitmq_management
重启服务才行,使用命令:
net stop RabbitMQ && net start RabbitMQ
可能出现这种结果:
“发生错误:发生系统错误 5。 拒绝访问。”
问题解决方案:使用管理员打开cmd再执行此命令:
在C:\Windows\System32 找到cmd.exe 双击执行。
则会时候使用rabbitmqctl控制台命令,安装完RabbitMQ在开始菜单会自动显示,如若没有,到安装路径下查找
创建用户,密码,绑定权限等。
注意:安装路径不同的请看仔细啊。
rabbitmq的用户管理包括增加用户,删除用户,查看用户列表,修改用户密码。
新增一个用户:
rabbitmqctl.bat add_user username password
查看已有用户及用户的角色:
rabbitmqctl.bat list_users
此时来看下我们当前用户后面没有“[administrator]”
这个administrator是干嘛用的呢?这就涉及到用户角色问题了:
rabbitmq用户角色可分为五类:超级管理员, 监控者, 策略制定者, 普通管理者以及其他。
可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。
可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。
仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。
无法登陆管理控制台,通常就是普通的生产者和消费者
我们也给新建的用户username 变成 “超级管理员” 角色:
rabbitmqctl.bat set_user_tags username administrator
修改密码:
rabbitmqctl change_password userName newPassword
删除已存在的用户:
rabbitmqctl.bat delete_user username
这样基本的配置就结束了。
然后我们打开浏览器 http://localhost:15672 访问Rabbit Mq的管理控制台,使用刚才创建的账号登陆系统:
设置虚拟主机和用户关系(默认虚拟主机名为 "/”),选中admin菜单,然后选中右边的 virtual hosts 菜单,如下图:
在最下面有一个添加虚拟主机,我们自己起好名称点击 add virtual host 即可。
然后再上面的列表中就可以看到你新添加的主机,再点击你新添加的虚拟主机,为其分配用户,我们首先可以分配我们前面创建的username 用户,然后也可以在admin→users页面添加新的用户后,再将其添加到当前新建的虚拟主机。
个人理解虚拟主机和用户的关系就是,用户需要依赖于虚拟主机,相当于一个服务器,不同用户基于同一服务器可以接受监听这一服务器上发生的内容
如何给虚拟主机添加多个用户
纠结很长时间解决的问题。。
进入VirtualHosts中
点击虚拟主机(这里是SpringBootVirtual)
进入虚拟主机管理页面中
找到permission
然后选择需要添加的user然后点击setpermission就ok!
配置RabbitMQ就到此结束了,相关RabbitMQ的命令操作具体可自行百度
接下来是java代码
新建maven工程
com.rabbitmq
amqp-client
3.6.5
我们先新建一个publisher()方法,在引入jar包的时候要特别注意,同样的名称有好几个包,我们统一都只引用 com.rabbitmq.client。
在queueDeclare方法中 除了队列名称外的其余4项参数意义如下
import com.rabbitmq.client.*;
import java.io.IOException;
/**
* java类简单作用描述
*
* @ProjectName: RabbitMQ
* @Package: PACKAGE_NAME
* @Description: java类作用描述
* @CreateDate: 2019/1/3 20:10
* @UpdateUser: lucas
* @Version: 1.0
*/
public class FirstRabbitMQ {
public static void main(String[] args) {
publisher();
System.out.println("msg: Send Over-----!");
consumer();
System.out.println("msg: Accept Down=======!");
}
//生产者
public static void publisher() {
Connection connection = null;
Channel channel = null;
try {
ConnectionFactory factory = new ConnectionFactory();
//设置连接地址 默认 localhost
factory.setHost("localhost");
// factory.setHost(ConnectionFactory.DEFAULT_HOST);
/*大多数情况下连接本地地址还是明确的写出来会比较好,
一般不推荐使用DEFAULT_HOST,
当报错信息是IOException或者连接错误,
某些情况下也要写明localhost地址是127.0.0.1
*/
factory.setPort(ConnectionFactory.DEFAULT_AMQP_PORT); //监听端口 默认5672
factory.setUsername("root"); //用户名
factory.setPassword("root"); //密码
factory.setVirtualHost("SpringBootVirtual"); // 虚拟主机
//创建与RabbitMQ服务器的TCP连接
connection = factory.newConnection();
channel = connection.createChannel(); //创建通道/频道
//参数中的 JQueue就是我们声明的队列名称
channel.queueDeclare("JQueue", true, false, false, null);
String message = "First Message"; //消息体
channel.basicPublish("", "JQueue", null, message.getBytes());
System.out.println("Send Message is:'" + message + "'");
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (channel != null) {
try {
channel.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//消费者
public static void consumer() {
Connection connection = null;
Channel channel = null;
try {
ConnectionFactory factory = new ConnectionFactory();
// factory.setHost(ConnectionFactory.DEFAULT_HOST);
factory.setHost("localhost");
factory.setPort(ConnectionFactory.DEFAULT_AMQP_PORT);
factory.setUsername("demo"); //注意此处的用户名和发布者不同,但是我将他们分配到了同一个虚拟主机,同样可以获取发布的消息
factory.setPassword("demo");
factory.setVirtualHost("SpringBootVirtual");
connection = factory.newConnection();
channel = connection.createChannel();
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(" Consumer have received '" + message + "'");
}
};
channel.basicConsume("JQueue", true, consumer); //绑定消费者和队列
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
在Queues中点击我们创建的队列
找到PublishMessage
在Payload中输入内容,在控制台可以捕获,说明消费者一直在监听此队列,一有消息就捕获。
这里的两个用户root和demo都部署在同一虚拟主机上,所以demo可以监听到
文章中有些许内容摘自其他博主,这里仅作为个人笔记参考。