中间件RabbitMQ的简单使用

使用环境搭建

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用户角色可分为五类:超级管理员, 监控者, 策略制定者, 普通管理者以及其他。

  • 超级管理员(administrator)

可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。

  • 监控者(monitoring)

可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)

  • 策略制定者(policymaker)

可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。

  • 普通管理者(management)

仅可登陆管理控制台(启用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工程

<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.6.5</version>
</dependency>

我们先新建一个publisher()方法,在引入jar包的时候要特别注意,同样的名称有好几个包,我们统一都只引用 com.rabbitmq.client。

在queueDeclare方法中 除了队列名称外的其余4项参数意义如下

  • @param durable true if we are declaring a durable queue (the queue will survive a server restart)
  • @param exclusive true if we are declaring an exclusive queue (restricted to this connection)
  • @param autoDelete true if we are declaring an autodelete queue (server will delete it when no longer in use)
  • @param arguments other properties (construction arguments) for the queue
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可以监听到
在这里插入图片描述
文章中有些许内容摘自其他博主,这里仅作为个人笔记参考。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值