RabbitMQ 消息队列学习笔记

服务环境: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

扫描二维码关注公众号,回复: 9026495 查看本文章

执行上面这条命令如果出现如下图错误:

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的客户端依赖

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

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);
        }
    }
}

运行消费者获取消息:

 

到此一个简单的消息队列已经实现,能力有限,内容仅供自己查阅。

发布了17 篇原创文章 · 获赞 70 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/zzqaaasss/article/details/101177047