使用Docker安装RabbitMQ并实现入门案例“Hello World”

news2024/10/6 6:46:53

RabbitMQ官方文档:RabbitMQ Tutorials — RabbitMQ

一、RabbitMQ安装(Linux下)

你可以选择原始的方式安装配置,也可以使用docker进行安装,方便快捷!

 1. 安装docker

没有docker的先安装一下docker,我这里示例的是Ubuntu的环境下:

CentOS下安装docker参考: Docker 从入门到精通-CSDN博客

#更新系统软件包列表
sudo apt update

#安装必要的软件包以允许apt通过HTTPS使用存储库
sudo apt install apt-transport-https ca-certificates curl software-properties-common

#添加Docker的官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

#添加Docker的稳定存储库
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

#更新软件包列表以包含Docker存储库
sudo apt update

#安装Docker引擎
sudo apt install docker-ce docker-ce-cli containerd.io

#验证Docker是否正确安装
sudo docker run hello-world

2. 安装 RabbitMQ

#搜索并拉取RabbitMQ的Docker镜像
sudo docker pull rabbitmq:management

#创建一个RabbitMQ容器并启动它
sudo docker run -d --name my-rabbit -p 5672:5672 -p 15672:15672 rabbitmq:management

#检查容器的状态
sudo docker ps

解释一下这个命令的参数:

  • -d:表示容器将以后台(守护进程)模式运行。
  • --name my-rabbit:为容器指定一个名称,这里是"my-rabbit",你也可以根据需要更改它。
  • -p 5672:5672:将主机的5672端口映射到容器的5672端口,这是RabbitMQ的默认端口。
  • -p 15672:15672:将主机的15672端口映射到容器的15672端口,这是RabbitMQ管理插件的Web界面端口。
  • rabbitmq:management:指定要使用的RabbitMQ镜像及其标签。

 3. 访问RabbitMQ的Web界面

注意:如果是云服务器,要在安全组配置中放行对应的端口。

使用用户名 guest,密码 guest 登录

 二、运行Hello World

1. 初始化工程

(1)在本地IDEA中创建一个空工程:

 (2)在这个空工程下添加两个子模块:rabbitmq-producer rabbitmq-consumer

 

 (3)添加rabbitmq依赖

分别在两个子模块的pom文件中添加如下内容:

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

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.3</version>
      </plugin>
    </plugins>
  </build>

 2. 编写生产者代码

package com.edu.chd.producer;

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 ProducerHelloWorld {
    public static void main(String[] args) throws IOException, TimeoutException {

        //1.设置连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //2.设置参数
        factory.setHost("123.249.112.12");  //这里对应的启动了rabbitMQ的云服务器的IP
        factory.setPort(5672); //默认的端口号就是5672 不写也行
        //3.创建连接
        Connection connection = factory.newConnection();
        //4.创建channer
        Channel channel = connection.createChannel();
        //5.创建队列 Queue
        /*
        在 RabbitMQ 中,channel.queueDeclare() 方法用于声明一个队列。该方法接受多个参数,下面是对每个参数的解释:
        queue(队列名称):指定要声明的队列的名称。
        durable(持久化):指定队列是否是持久化的。当 RabbitMQ 重新启动时,持久化的队列将被保留下来。如果将该参数设置为 true,则队列将被持久化;如果设置为 false,则队列不会被持久化。注意,这里指的是队列本身的持久化,而不是队列中的消息。
        exclusive(排他性):指定队列是否是排他的。如果将该参数设置为 true,则该队列只能被当前连接的消费者使用,并且在连接关闭时会自动删除该队列。如果设置为 false,则队列可供多个消费者使用。
        autoDelete(自动删除):指定队列在不再被使用时是否自动删除。如果将该参数设置为 true,则当队列不再被消费者使用时,将自动删除该队列。如果设置为 false,则队列不会自动删除。
        arguments(参数):指定队列的其他属性和参数,以键值对的形式提供。
        这些参数在声明队列时提供了一些灵活性和控制选项,以适应不同的应用场景和需求。
        */
        //以下代码声明了一个名为 "hello_world" 的队列,该队列是持久化的、非排他的、不自动删除的
        channel.queueDeclare("hello_world",true,false,false,null);
        //6.发送消息
        String body = "hello world! RabbitMQ!";
        channel.basicPublish("","hello_world",null,body.getBytes());
        //7.释放资源
        channel.close();
        connection.close();
    }
}

运行生产者代码,访问RabbitMQ的控制页面:

可以看到已经有了一条消息在队列中

 3. 编写消费者代码

import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;

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

        //1.设置连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //2.设置参数
        factory.setHost("123.249.112.12");
        factory.setPort(5672);
        //3.创建连接
        Connection connection = factory.newConnection();
        //4.创建channer
        Channel channel = connection.createChannel();

        //5.接收消息
        //创建了一个消费者对象并实现了 handleDelivery() 方法作为回调方法。当消费者收到消息时,将自动执行该方法。
        Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("消费消息内容:" + new String(body));
            }
        };
        /*
            public String basicConsume(String queue, boolean autoAck, Consumer callback) throws IOException {
                return this.basicConsume(queue, autoAck, "", callback);
            }
            参数说明:
                queue(队列名称):指定要从中消费消息的队列的名称。
                autoAck(自动确认):指定消费者在接收到消息后是否自动发送确认。如果将该参数设置为 true,消费者在接收到消息后会自动确认,告知 RabbitMQ 该消息已被成功处理。
                                   如果设置为 false,则需要手动调用 channel.basicAck() 方法来发送确认。
                consumerTag(消费者标签):指定消费者的标识符。如果将该参数设置为空字符串 "",RabbitMQ 会自动生成一个唯一的消费者标签。
                callback(消费者回调):指定一个 Consumer 对象,用于处理接收到的消息。你可以实现自己的 Consumer 接口或使用现有的实现。
         */
        channel.basicConsume("hello_world",true,consumer);

        //不需要关闭资源,因为关闭了就没法从消息队列获取消息了
    }
}

运行消费者代码,可以看到控制台的输出:

 进入RabbitMQ控制页面查看,可以看到有一个消费者,并且刚才的消息已经被消费了:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/727123.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谷歌和edge浏览器升级到94及以上版本后反复提示安装pageoffice客户端

原因&#xff1a;Chrome开发团队以网络安全为由&#xff0c;强推ssl证书&#xff0c;希望所有部署在公网的网站&#xff0c;全部改用https访问&#xff0c;所以最新的谷歌和edge升级到94版本后对公网上的http请求下的非同域的http请求进行了拦截&#xff0c;于是就出现了目前遇…

一分钟告诉你国内和国外的ai绘画软件哪个好

前几天&#xff0c;我在一次聚会上偶然听到朋友们谈论起创作ai绘画的问题&#xff0c;大家都很热衷于用国内的ai绘画软件来生成自己喜欢的艺术作品&#xff0c;但又不知道国内和国外的ai绘画软件哪个好。正当我们陷入无尽的思考中时&#xff0c;其中一位朋友突然站出来说&#…

【计算机网络】1.5——计算机网络的体系结构

计算机网络的体系结构 概述 计算机网络的体系结构是计算机网络及其构建所应完成功能的精确定义 考题 不属于网络体系结构所描述的内容的是 A、网络的层次 B、每层使用的协议 C、协议的内部实现细节 D、每层必须完成的功能 这些功能的「实现细节」&#xff0c;是遵守这种体系…

SPEC CPU 2017 Ubuntu 20.04 LTS cpu2017-1_0_5.iso 安装、测试 单核成绩 笔记

环境 $ gcc -v Using built-in specs. COLLECT_GCCgcc COLLECT_LTO_WRAPPER/usr/lib/gcc/x86_64-linux-gnu/11/lto-wrapper OFFLOAD_TARGET_NAMESnvptx-none:amdgcn-amdhsa OFFLOAD_TARGET_DEFAULT1 Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pk…

vue3中的computed和watch

一、computed 1. vue2和vue3中计算属性用法对比 Vue2中的计算属性 Vue2中的计算属性是通过在Vue实例的computed选项中定义函数来创建的。计算属性会根据依赖的响应式属性进行缓存&#xff0c;只有当依赖的属性发生变化时&#xff0c;计算属性才会重新求值。 举个例子&#x…

【环境配置】Conda报错 requests.exceptions.HTTPError

问题&#xff1a; conda 创建新的虚拟环境时报错 Collecting package metadata (current_repodata.json): done Solving environment: done# >>>>>>>>>>>>>>>>>>>>>> ERROR REPORT <<<<<<…

OpenCVForUnity(二)基本图像容器Mat

这里写目录标题 前言Mat指针引用说明存储的方式如何创建一个Mat对像 前言 今天继续学习OpenCV的基本单位Mat. 学计算机的同学都知道在计算机中,你所看到的一切其都是数据的呈现.期最底层的本质皆是0和1的构成的.当然图片,视频等等也不例外.我们用相机,扫描仪核磁共振成像等方式…

OpenAI深夜放大招,GPT4 API全面开放并弃用一系列旧模型

GPT-4 API 现已向所有付费 OpenAI API 客户开放。GPT-3.5 Turbo、DALLE 和 Whisper API 现已普遍可用&#xff0c;我们宣布了一些旧型号的弃用计划&#xff0c;这些型号将于 2024 年初退役。 ✅ GPT4 API面向付费用户开放&#xff0c;不需要再额外申请,并且具有8K上下文&#…

bash文件输入到txt文件中

bash test_bct.sh >> test.txt结果如下

WeeChat 4.0.0 正式发布

导读WeeChat (Wee Enhanced Environment for Chat) 是一款自由开源的轻量级 IRC 客户端&#xff0c;具有高度的可定制特性&#xff0c;并且可以通过脚本进行扩展。 WeeChat 支持大多数的平台和操作系统&#xff0c;例如 Linux、BSD、macOS、Debian GNU/Hurd、HP-UX、Solaris、…

全国产化适配低代码平台,政企数字化的不二选择

编者按&#xff1a;在国家政策及战略方向的指导下&#xff0c;信创产业已成为奠定中国未来发展的重要数字基础&#xff0c;而国产化则可以解决核心技术关键被“卡脖子”的问题。另一方面&#xff0c;低代码平台能够为企业加速交付业务应用&#xff0c;降低运营成本&#xff0c;…

插入排序(思路+代码)

变量&#xff1a; index &#xff1a;代表待插入数的前一个数的下标&#xff0c;依次往回找&#xff0c;找到找到结果。 indexvalue&#xff1a;代表待插入元素的值&#xff0c;找到位置之后往index1的位置插入元素 代码&#xff1a; import java.util.Arrays;public class …

【库表操作】

一、数据库Market中创建表customers 1、创建数据库 #创建数据库 mysql> create database Market; mysql> use Market;2、创建数据表 #创建数据表 mysql> create table customers(-> c_num int(11) primary key auto_increment,-> c_name varchar(50),-> c_…

iOS-配置Universal Links通用链接

1、开启Associated Domains服务 登录苹果开发者网站&#xff0c;在Certificates, Identifiers & Profiles页面左侧选择Identifiers&#xff0c;右侧选择对应的App ID&#xff0c;点击进入配置详情页&#xff0c;开启Associated Domains服务&#xff1b; 2、更新Profile文件…

【动手学习深度学习--逐行代码解析合集】09权重衰减

【动手学习深度学习】逐行代码解析合集 09权重衰减 视频链接&#xff1a;动手学习深度学习–权重衰减 课程主页&#xff1a;https://courses.d2l.ai/zh-v2/ 教材&#xff1a;https://zh-v2.d2l.ai/ 0、准备工作 import matplotlib # 注意这个也要import一次 import matplotli…

Wordpress的mysql迁库遇到问题

在我们迁移库的时候经常会出现如下问题&#xff1a; 5.7日期默认0000-00-00 00:00:00 设置错误。 MySQL默认设置中不支持日期datetime格式下的0000-00-00 00:00:00。 解决方法如下&#xff1a; select sql_mode 来查看对应内容 ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO…

vue打包后,生成的dist文件出现浏览器缓存问题——技能提升

最近同事问我&#xff0c;打包后的项目放在服务器上后&#xff0c;在终端打开时&#xff0c;必须清除浏览器缓存也就是ctrlF5才可以。 我打包后查看dist/index.html文件 发现没有css和js文件都有不同版本号的标识&#xff0c;按道理来说&#xff0c;是不会出现这个缓存的问题…

在Chrome谷歌浏览器中执行JavaScript的方法

在Chrome谷歌浏览器中如何执行JavaScript&#xff1f;在Chrome 浏览器中可以通过按下 F12 按钮或者右击页面&#xff0c;选择"检查"来开启开发者工具。 也可以在右上角菜单栏选择 "更多工具"》"开发者工具" 来开启&#xff1a; 1、Console 窗口调…

基于机器学习的情感分析

1基于机器学习 是指选取情感词作为特征词&#xff0c;将文本矩阵化&#xff0c;利用logistic Regression, 朴素贝叶斯(Naive Bayes)&#xff0c;支持向量机&#xff08;SVM&#xff09;等方法进行分类。最终分类效果取决于训练文本的选择以及正确的情感标注。 在训练过程&#…

骨传导耳机音质怎么样,盘点在音质方面表现不错的五款骨传导耳机

骨传导耳机凭借不入耳就能轻松听音乐的特点&#xff0c;被越来越多人所认识&#xff0c;相比传统的入耳式耳机&#xff0c;骨传导耳机拥有更多的可玩性&#xff0c;比如说跑步、游泳、健身都可以佩戴骨传导耳机&#xff0c;即使长时间佩戴也不会出现不适感&#xff0c;也不会出…