centos 7 安装RabbitMQ并用java代码实战RabbitMQ的五种消息模型

本文详细介绍了如何在CentOS 7上安装RabbitMQ,并通过Java代码实现RabbitMQ的简单模式、工作队列模式、发布/订阅模式、路由模式和主题模式。在安装过程中,涵盖了从更新yum插件、安装Erlang到创建RabbitMQ存储库、启动RabbitMQ服务和允许远程访问的完整步骤。随后,文章通过前置准备和实战代码展示了如何使用Java实现RabbitMQ的五种消息模型,包括一对一模式、按能分配、广播模式、路由模式和主题模式。最后,文章提到了因版本问题导致的头部设置问题及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 一、安装RabbitMQ

1.yum安装 

Ⅰ.安装或更新yum插件

Ⅱ.安装 Erlang

Ⅲ、创建yum的RabbitMQ官方存储库

Ⅳ、安装RabbitMQ

Ⅴ、启动RabbitMQ

Ⅵ 、登录RabbitMQ的后台

Ⅶ、让guest可以远程登录 

二、java代码实战RabbitMQ的五种消息模型

前置准备

Ⅰ.新建host                  

Ⅱ.新建队列

Ⅲ、新建项目

    1.简单模式(Simple Mode) / 一对一模式

  2.工作队列模式(Work Queue Mode)

Ⅰ、公平的工厂模式

Ⅱ、按能分配

  3.发布/订阅模式(Publish/Subscribe Mode)

4.路由模式(Routing Mode)

   5.主题模式(Topic Mode)

三、补充内容

1.可能因为版本原因不能够旧方法设置头部取头部

Ⅰ、背景描述

Ⅱ、方法的代码 


 一、安装RabbitMQ

1.yum安装 

Ⅰ.安装或更新yum插件

 

sudo yum update


我这个是安装过的样子

Ⅱ.安装 Erlang


RabbitMQ基于Erlang语法,高效但是需要Erlang支持
我们之后要下载的是rabbitMQ 3.10 需要

首先安装存储库

sudo yum install epel-release

 中间会询问是否安装,输入y就行了
 

创建yum的erlang数据库(直接下载版本太低了)

cd /etc/yum.repos.d
sudo touch /etc/yum.repos.d/erlang.repo
vi erlang.repo

编写文件为

[erlang-solutions]
name=CentOS $releasever - $basearch - Erlang Solutions
baseurl=https://packages.erlang-solutions.com/rpm/centos/$releasever/$basearch
gpgcheck=1
gpgkey=https://packages.erlang-solutions.com/rpm/erlang_solutions.asc
enabled=1

如果之前安过低版本要先删除
 

后面改成你的版本
sudo yum remove erlang-erts-R16B-03.18.el7.x86_64

 然后就可以安装
 

sudo yum install erlang

 我们没有添加公钥,会警告一下

 然后输入y就行了

Ⅲ、创建yum的RabbitMQ官方存储库


添加 RabbitMQ 的官方存储库密钥到系统
 

sudo rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc

添加 RabbitMQ 的官方存储库到 yum:
 

sudo touch /etc/yum.repos.d/rabbitmq.repo

然后修改这个文件
 

cd  /etc/yum.repos.d
vi rabbitmq.repo
[rabbitmq]
name=rabbitmq
baseurl=https://packagecloud.io/rabbitmq/rabbitmq-server/el/7/$basearch
enabled=1
gpgcheck=0
repo_gpgcheck=0

Ⅳ、安装RabbitMQ


查看可用版本
 

sudo yum --disablerepo="*" --enablerepo="rabbitmq" list available

 可安装版本是3.10.0-1 官网最新版本是3.12.2 如果想要安装最新版本可以先使用其他方法
 

我们选择安装
 

sudo yum install rabbitmq-server


如果提示版本不足,请记住版本号之后,回到上面安装Erlang的步骤删除旧版本,重新安装erlang到正确版本

这样就安装好了 

 

安装之后的路径在
 

/usr/lib/rabbitmq

Ⅴ、启动RabbitMQ

和其他的软件一样,如果需要外部服务器访问,需要更改防火墙

检查防火墙状态
 

sudo systemctl status firewalld

 如果防火墙未启用(启用了可以跳过,虚拟机也可以不开防火墙,但养成习惯服务器不会忘记)
便输入下面指令开启防火墙

sudo systemctl start firewalld

开启5672和15672 (后者是控制台)

firewall-cmd --add-port=5672/tcp --permanent
firewall-cmd --add-port=15672/tcp --permanent

 提示success就对了(我这个是重复添加) 

重新加载防火墙 

firewall-cmd --reload

提示success

 验证端口是否打开(这样出现了连接不上可以排除这里)
 

firewall-cmd --query-port=15672/tcp
firewall-cmd --query-port=5672/tcp

 出现yes就是对的了

 启动管理工具
 

rabbitmq-plugins enable rabbitmq_management 

 如果报下面的错就是15672被占用,可能是重复开启(如果提前改了配置文件再重启服务也能达到上面那个指令效果)

 我们可以查看下端口占用

sudo ss -tlnp | grep 15672
选一个允许 如果不是centos 7 还有其他的指令
sudo netstat -tlnp | grep 15672

 占用端口15672的进程是beam.smp,它是RabbitMQ服务器的核心进程。这意味着RabbitMQ管理插件已经在监听15672端口,并且正常工作。
如果不是beam.smp我们可以杀死之后,再启动管理工具
 

sudo kill <PID>   -- 实例代码 <PID> 换成想杀死的队列
sudo kill 15672

Ⅵ 、登录RabbitMQ的后台
 

我们新建一个用户,并赋予管理员权限,来远程访问我们控制台

rabbitmqctl add_user admin admin

前面是用户名,后面是密码 密码还是改复杂点

  新建了一个简单用户怕不安全,可以用下面指令改密码
 

sudo rabbitmqctl change_password admin <新密码>

 赋予管理员权限

rabbitmqctl set_user_tags admin administrator

 然后我们可以去主机访问下虚拟机或者服务器(这次没有用虚拟机,没有安装图形化和浏览器就只演示主机连接虚拟机,平时在本地访问对应端口是确保真的启动了软件)
 

你的虚拟机ip或者服务器公网ip:15672

 然后输入刚才新建的用户就登录上去了

Ⅶ、让guest可以远程登录 

guest拥有最高的权限但是不能在非本机登录(比如服务器就得登服务器,我用主机连接服务器的rabbit并登录guest,就会被拒绝)
可是需要guest的权限来做事情,服务器又没有图形化,直接敲命令又不熟练差点把人急死

 我们需要改配置

/etc/rabbitmq

如果有rabbitmq.config就修改,没有就新建
 

touch rabbitmq.config
vi rabbitmq.config

 确保里面有
 

[{rabbit, [{loopback_users, []}]}].

 

 这个时候重启就行了
 

sudo systemctl restart rabbitmq-server

 重启访问 
 

http://rabbitmq的主机地址:15672/

 就能用guest登录了

 登录之后去改密码

 

 一些需要高权限的事情,就用guest做,平时还是用admin

二、java代码实战RabbitMQ的五种消息模型

 

前置准备

 

Ⅰ.新建host                  

首先在后台新建host并创建响应的队列

 

 可以只输入一个名字

 

然后  Add virtual host


这里就有我们配置好的,点击这个加减可以选择显示的属性

Ⅱ.新建队列

 

然后我们还要创建队列

 

 点击add a newqueue之后

 

这里就有我们刚新建的host了

我们看见了队列的三种类型,分别是下面三种,我们只要经典队列就行了
 

经典队列(Classic Queue): 经典队列(也称为普通队列)是 RabbitMQ 最常见和默认的队列类型。它支持多个消费者并且提供了传统的消息传递模式。

Quorum 队列(Quorum Queue): Quorum 队列是 RabbitMQ 3.8 版本引入的一种新的队列类型。它基于 Raft 一致性协议,提供更高的可靠性和良好的扩展性。Quorum 队列适用于高吞吐量和高可靠性的应用场景。

流队列(Stream Queue): 流队列是 RabbitMQ 3.9 版本中引入的新队列类型。它是为了解决大规模事件流处理而设计的。流队列支持发布/订阅模式,具备持久化和分区等特性,能够处理大量的事件流数据。

 

 

 这里我们就建好了

Ⅲ、新建项目

 

 新建一个maven项目(基于IDEA 2023.2 演示 如果版本相同,缺很多东西一般是教育免费版)
在pom.xml中添加依赖
 

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

 

 再编写一下工具来进行RabbitMQ的连接
 

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

import java.io.IOException;

public class MQUtils {

    public static final String QUEUE_NAME = "myqueue01";   //队列1 我们刚才新建了
    public static final String QUEUE_NAME2 = "myqueue02";  //队列2 我们没有新建 (也可以在使用的时候直接写名字)

    public static final String EXCHANGE_NAME = "myexchange01";  //路由名字 后面要定义
    public static final String EXCHANGE_NAME2 = "myexchange02";
    public static final String EXCHANGE_NAME3 = "myexchange03";

    /**
     * 获得MQ的连接
     * @return
     * @throws IOException
     */
    public static Connection getConnection() throws IOException {
        ConnectionFactory connectionFactory = new ConnectionFactory();

        connectionFactory.setHost("localhost");     // 服务器的主机名
        connectionFactory.setPort(5672);            // 服务器的主机名
        connectionFactory.setVirtualHost("myhost"); //我们虚拟出来的主机名(刚才新建的主机名)
        connectionFactory.setUsername("admin");     //我们新建的用户
        connectionFactory.setPassword("123456");    //以及我们新建用户的密码
        return connectionFactory.newConnection();  // 返回Connection用于后续操作
    }
}

    1.简单模式(Simple Mode) / 一对一模式

      首先来熟悉一下简单模式的流程

         发布者(Producer) --> 队列(Queue) --> 消费者(Consumer)
      ①.生产者将消息直接发送到一个队列。
      ②.消费者从队列中接收消息并进行处理。
         明确了需要的东西之后我们开始建包(不理解生产者消费者的,可以去我的主页的堵塞队列里面看一下,讲的 比较俗  易懂)

 首先是生产者
 

import com.cece.utils.MQUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

import java.io.IOException;

import com.cece.utils.MQUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

import java.io.IOException;

/*
 * 简单模式的生成者 将消息直接发送到一个队列
 */
public class SimpleProducer {
    public static void main(String[] args) throws IOException {
        // 获取与 RabbitMQ 的连接
        Connection connection = MQUtils.getConnection();

        // 创建通道
        Channel channel = connection.createChannel();

        // 定义队列
        // 参数说明:
        //  - MQUtils.QUEUE_NAME: 队列名称
        //  - false: 指定队列是否持久化,false 表示不持久化
        //  - false: 指定当所有消费者客户端连接断开时,是否删除队列。false 表示不删除
        //  - false: 指定是否独占队列。false 表示队列可以被多个消费者监听
        //  - null: 其他属性,比如队列的消息过期时间等。这里为 null

        channel.queueDeclare(MQUtils.QUEUE_NAME, false, false, false, null);

        // 要发送的消息内容
        String msg = "Hello World!";

        // 发布消息到队列
        // 参数说明:
        //  - "": 交换机名称。空字符串表示直接发送到队列,不经过交换机
        //  - MQUtils.QUEUE_NAME: 队列名称
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值