RabbitMQ的安装及入门使用

最近由于要和另一家公司对接数据,对方打算用消息队列RabbitMQ来对接数据,由于之前没有用过RabbitMQ,只用过activeMQ,开完会回来花了点时间学了下RabbitMQ,并把学习的过程记录下来。

1.安装Erlang
所以在安装rabbitMQ之前,需要先安装Erlang 。点击下载Erlang
这里写图片描述
我使用的是OTP 20.0
执行下载下来的Erlang,全部点击“下一步”就行。
安装完成设置一下环境变量。
这里写图片描述

2.安装RabbitMQ
下载运行rabbitmq-server-3.7.7.exe。
RabbitMQ官网
依旧可以不改变默认进行安装。
这里写图片描述

进入RabbitMQ的安装目录,执行rabbitmq-plugins.bat enable rabbitmq_management
这里写图片描述
重新启动RabbitMQ
这里写图片描述
添加用户及设置角色
这里写图片描述
此时wzw这个用户还没有 虚拟主机“/”中的写、读权限
这里写图片描述
授权(RabbitMQ默认的vhost是 /)
这里写图片描述
wzw用户和guest用户拥有一样的权限了
这里写图片描述

前面创建的用户使用的虚拟主机(virtual host)是安装RabbitMQ时默认的虚拟主机。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 / 。

下面介绍如何创建虚拟主机及授权用户使用新建的虚拟主机。
这里写图片描述
创建新的虚拟主机 “test” 和创建用户 “test” 设置用户test为administrator角色,授权用户test拥有访问虚拟主机test的所有权限。

E:\RabbitMQ\rabbitmq_server-3.7.7\sbin>rabbitmqctl add_vhost test
Adding vhost "test" ...

E:\RabbitMQ\rabbitmq_server-3.7.7\sbin>rabbitmqctl.bat add_user test 123456
Adding user "test" ...

E:\RabbitMQ\rabbitmq_server-3.7.7\sbin>rabbitmqctl  set_permissions -p test  test .* .* .*
Setting permissions for user "test" in vhost "test" ...

E:\RabbitMQ\rabbitmq_server-3.7.7\sbin>rabbitmqctl set_user_tags test administrator
Setting tags for user "test" to [administrator] ...

如果觉得命令行操作麻烦,可以使用浏览器打开 http://localhost:15672 访问Rabbit Mq的管理控制台,在控制台里创建用户及授权。

登录页面
这里写图片描述
登录成功首页
这里写图片描述
添加用户及授权页面
这里写图片描述

最后附上java测试代码

生产者

package org.wu.work.util;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Producer {

    public static void main(String[] args) throws IOException, TimeoutException {
        //创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setUsername("test");
        factory.setPassword("123456");
        //设置 RabbitMQ 地址
        factory.setHost("localhost");

        //设置RabbitMQ VirtualHost 如果不设置,则使用默认的VirtualHost:"/"
        factory.setVirtualHost("test");
        //建立到代理服务器到连接
        Connection conn = factory.newConnection();
        //获得信道
        Channel channel = conn.createChannel();
        //声明交换器
        String exchangeName = "my_exchange";
        channel.exchangeDeclare(exchangeName, "direct", true);

        String routingKey = "my_key";
        //发布消息
        byte[] messageBodyBytes = "hello world!".getBytes();
        channel.basicPublish(exchangeName, routingKey, null, messageBodyBytes);

        channel.close();
        conn.close();
    }
}

消费者

package org.wu.work.util;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Consumer {

    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setUsername("test");
        factory.setPassword("123456");
        factory.setHost("localhost");
        //设置RabbitMQ VirtualHost 如果不设置,则使用默认的VirtualHost:"/"
        factory.setVirtualHost("test");
        //建立到代理服务器到连接
        Connection conn = factory.newConnection();
        //获得信道
        final Channel channel = conn.createChannel();
        //声明交换器
        String exchangeName = "my_exchange";
        channel.exchangeDeclare(exchangeName, "direct", true);
        //声明队列
        String queueName = channel.queueDeclare().getQueue();
        String routingKey = "my_key";
        //绑定队列,通过键 my_key 将队列和交换器绑定起来
        channel.queueBind(queueName, exchangeName, routingKey);

        while(true) {
            //消费消息
            boolean autoAck = false;
            String consumerTag = "";
            channel.basicConsume(queueName, autoAck, consumerTag, new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag,
                                           Envelope envelope,
                                           AMQP.BasicProperties properties,
                                           byte[] body) throws IOException {
                    String routingKey = envelope.getRoutingKey();
                    String contentType = properties.getContentType();
                    System.out.println("消费的路由键:" + routingKey);
                    System.out.println("消费的内容类型:" + contentType);
                    long deliveryTag = envelope.getDeliveryTag();
                    //确认消息
                    channel.basicAck(deliveryTag, false);
                    System.out.println("消费的消息体内容:");
                    String bodyStr = new String(body, "UTF-8");
                    System.out.println(bodyStr);

                }
            });
        }
    }
}

先启动消费者,然后再启动生产者。
消费者打印如下结果
这里写图片描述

参考资料:
http://www.cnblogs.com/ericli-ericli/p/5902270.html
https://www.jianshu.com/p/79ca08116d57

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值