RabbitMQ教程与安装

1 在CentOS7中安装RabbitMQ

     在 CentOS 中安装 RabbitMQ 的命令如下:

  1. 首先,确保已经安装了 EPEL 软件包存储库。如果没有,请运行以下命令安装它:

     sudo yum install epel-release
  2. 更新系统的软件包列表:

    sudo yum update
  3. 安装 RabbitMQ:

    sudo yum install rabbitmq-server
  4. 启动 RabbitMQ 服务并设置启动开机自启动:

    sudo systemctl start rabbitmq-server
    sudo systemctl enable rabbitmq-server

现在,RabbitMQ 已经成功安装并启动在 CentOS 上了。你可以通过访问 http://ip:15672/ 来访问 RabbitMQ 的管理界面,默认的用户名和密码为 guest

 2 测试RabbitMQ

  1. 查看RabbitMQ的状态
  2. 然后添加user执行命令 比如设置为admin 
  3. set_user_tags 用于给用户设置管理员角色
  4. 设置用户权限
  5. 打开UI界面  这里需要启动插件
sudo service rabbitmq-server status
rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
rabbitmq-plugins enable rabbitmq_management
#打开UI界面后,重启rabbitmq生效
service rabbit-mq restart

 3 MQ三大特点

  1. 流量削峰
  2. 应用解耦
  3. 异步处理

4 RabbitMQ的工作模式

4.1 模式一:简单工作模式

简单工作模式概念:一个生产者将任务发送到队列中,一个消费者并从队列中接收并处理任务。 

4.1.1  概念 

  1. 生产者(Producer):生产者负责生成任务并将其发送到队列中。在 RabbitMQ 中,生产者将消息发送到一个名为交换机(Exchange)的中间件组件上。

  2. 队列(Queue):队列是存储任务的地方。它是一个缓冲区,可以按照先进先出(FIFO)的顺序存储任务。

  3. 消费者(Consumer):消费者等待从队列中接收任务,并进行处理。每个消费者都独立地处理任务,并且可以以不同的速度处理任务。当消费者完成任务后,会从队列中删除该任务。

4.1.2 举例说明

常量类: RabbitConstant.class

package com.bean;

public class RabbitConstant {
    public static final String QUEUE_HELLOWORLD = "hello";
    
}

工具类: RabbitUtils.class

package com.utils;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class RabbitUtils {
    private static ConnectionFactory connectionFactory = new ConnectionFactory();
    static {
        connectionFactory.setHost("192.168.164.128");
        connectionFactory.setPort(5672);  //默认端口是5672
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("admin");
        connectionFactory.setVirtualHost("/");
    }
    public static Connection getConnection(){
        Connection conn = null;
        try {
            conn = connectionFactory.newConnection();
            return conn;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
/*
    public static void main(String[] args) {
        // 获取RabbitMQ连接
        Connection connection = RabbitUtils.getConnection();

        // 打印连接信息
        System.out.println("成功获取RabbitMQ连接:" + connection);
    }
 */
}

生产者:Producer.class

package com.producer;

import com.bean.RabbitConstant;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.utils.RabbitUtils;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Producer {

    public static void main(String[] args) throws IOException, TimeoutException {
        //获取TCP长连接
        Connection conn = RabbitUtils.getConnection();
        //创建通信“通道”,相当于TCP中的虚拟连接
        Channel channel = conn.createChannel();

        //创建队列,声明并创建一个队列,如果队列已存在,则使用这个队列
        //第一个参数:队列名称ID
        //第二个参数:是否持久化,false对应不持久化数据,MQ停掉数据就会丢失
        //第三个参数:是否队列私有化,false则代表所有消费者都可以访问,true代表只有第一次拥有它的消费者才能一直使用,其他消费者不让访问
        //第四个:是否自动删除,false代表连接停掉后不自动删除掉这个队列
        //其他额外的参数, null
        channel.queueDeclare(RabbitConstant.QUEUE_HELLOWORLD,false, false, false, null);

        String message = "helloworld";
        //四个参数
        //exchange 交换机,使用默认的
        //队列名称
        //额外的设置属性
        //最后一个参数是要传递的消息字节数组
        channel.basicPublish("", RabbitConstant.QUEUE_HELLOWORLD, null,message.getBytes());
        channel.close();
        conn.close();
        System.out.println("===发送成功===");

    }
}

RabbitMQ教程与安装_第1张图片

消费者:Consumer.class

package com.consumer;

import com.bean.RabbitConstant;
import com.rabbitmq.client.*;
import com.utils.RabbitUtils;

import java.io.IOException;
import java.util.concurrent.TimeoutException;


public class Consumer {

    public static void main(String[] args) throws IOException, TimeoutException {


        //获取TCP长连接
        Connection conn = RabbitUtils.getConnection();
        //创建通信“通道”,相当于TCP中的虚拟连接
        Channel channel = conn.createChannel();

        //创建队列,声明并创建一个队列,如果队列已存在,则使用这个队列
        channel.queueDeclare(RabbitConstant.QUEUE_HELLOWORLD, false, false, false, null);

        //从MQ服务器中获取数据
        //创建一个消息消费者
        //第一个参数:队列名
        //第二个参数代表是否自动确认收到消息,false代表手动编程来确认消息,这是MQ的推荐做法
        //第三个参数要传入DefaultConsumer的实现类
        channel.basicConsume(RabbitConstant.QUEUE_HELLOWORLD, false, new Reciver(channel));


    }
}

class Reciver extends DefaultConsumer {

    private Channel channel;

    //重写构造函数,Channel通道对象需要从外层传入,在handleDelivery中要用到
    public Reciver(Channel channel) {
        super(channel);
        this.channel = channel;
    }

    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {

        String message = new String(body);
        System.out.println("消费者接收到的消息:" + message);
        System.out.println("消息的TagId:" + envelope.getDeliveryTag());
        //false只确认签收当前的消息,设置为true的时候则代表签收该消费者所有未签收的消息
        channel.basicAck(envelope.getDeliveryTag(), false);
    }
}

你可能感兴趣的:(Linux,rabbitmq,ruby,分布式)