RabbitMQ基本使用,docker安装RabbitMQ,SpringBoot整合RabbitMQ

news2024/12/30 3:19:01

1.拉取镜像

docker pull rabbitmq:3.9.15-management

2.运行容器

docker run -d --hostname rabbit1 --name myrabbit1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.9.15-management

3.访问地址

安装ip加端口号

http://192.168.123.3:15672/

客户端如下:

在这里插入图片描述
登录账号密码:
username:guest
password:guest

4.新增用户

创建管理员账号:
admin
admin
点击add user保存
在这里插入图片描述

在这里插入图片描述

5.新增虚拟空间

在这里插入图片描述

名字要以/开头
/mqname1
在这里插入图片描述

创建成功
在这里插入图片描述

查看是否授予权限
在这里插入图片描述
授权给guest用户权限,根据自己需要授权
在这里插入图片描述
授权成功
在这里插入图片描述

6.原生RabbitMq代码实现

加入依赖

        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.6.0</version>
        </dependency>
package com.mq.pruducer;

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

/**
 * @Author: 简单模式生产者
 * @Date: 2024/01/29/15:16
 * @Description: good good study,day day up
 */
public class SimpleProducer {


    /**
     * 简单模式消息的生产者发送消息
     * @param args
     */
    public static void main(String[] args) throws Exception{
        //创建连接工厂对象
        ConnectionFactory connectionFactory = new ConnectionFactory();
        //设置RabbitMQ服务主机地址
        connectionFactory.setHost("192.168.3.123");
        //设置RabbitMQ服务端口,默认5672
        connectionFactory.setPort(5672);
        //设置虚拟主机名字,默认/
        connectionFactory.setVirtualHost("/mqname1");
        //设置用户连接名,默认guest
        connectionFactory.setUsername("admin");
        //设置连接密码,默认guest
        connectionFactory.setPassword("admin");
        //创建连接
        Connection connection = connectionFactory.newConnection();
        //创建频道
        Channel channel = connection.createChannel();
        //声明队列
        /**
         * 1.队列的名字
         * 2.持久化
         * 3.是否独占队列,ture:只有这个对象可以操作这个队列,其他的对象如果要操作,只能等这个队列操作结束,相当于加锁
         * 4.在本次连接释放以后,是否删除队列---类似数据库临时表
         * 5.队列的附加属性
         */
        channel.queueDeclare("simple_queue", true, false, false, null);

        for (int i = 0; i < 10; i++) {
            //创建消息
            String message = "这是RabbitMQ的第" + i + "条消息!";
            //消息发送
            /**
             * 1.交换机
             * 2.routingkey是什么:简单模式下和队列的名字保持一致
             * 3.消息的附加属性是什么
             * 4.消息的内容是什么
             */
            channel.basicPublish("","simple_queue", null, message.getBytes());
            //关闭资源
        }
        channel.close();
        connection.close();
    }
}

查看发送消息
在这里插入图片描述

在这里插入图片描述
发送了10条消息
在这里插入图片描述

消费消息

package com.mq.consumer;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

/**
 * @Author: 简单模式消息消费者
 * @Date: 2024/01/29/15:31
 * @Description: good good study,day day up
 */
public class SimpleConsumer {


    /**
     * 简单模式消息消费者接受消息
     * @param args
     */
    public static void main(String[] args) throws Exception{
        //创建连接工厂对象
        ConnectionFactory connectionFactory = new ConnectionFactory();
        //设置RabbitMQ服务主机地址,默认localhost
        connectionFactory.setHost("192.168.3.123");
        //设置RabbitMQ服务端口,默认5672
        connectionFactory.setPort(5672);
        //设置虚拟主机名字,默认/
        connectionFactory.setVirtualHost("/mqname1");
        //设置用户连接名,默认guest
        connectionFactory.setUsername("admin");
        //设置连接密码,默认guest
        connectionFactory.setPassword("admin");
        //创建连接
        Connection connection = connectionFactory.newConnection();
        //创建频道
        Channel channel = connection.createChannel();
        //声明队列
        /**
         * 1.队列的名字
         * 2.持久化
         * 3.是否独占队列
         * 4.在本次连接释放以后,是否删除队列---临时表
         * 5.队列的附加属性
         */
        channel.queueDeclare("simple_queue", true, false, false, null);
        //创建消费者,并设置消息处理:自定义的操作
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
            /**
             * 真实自定义处理消息的逻辑
             * @param consumerTag:消息的标签
             * @param envelope:消息的属性:消息属于哪个交换机发来的, 消息数据哪个队列=消息routingkey是什么,消息的编号
             * @param properties
             * @param body:消息的内容
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException, UnsupportedEncodingException {
                String s = new String(body, "UTF-8");
                System.out.println("收到的消息的内容为:" + s);
                long deliveryTag = envelope.getDeliveryTag();//消息的编号
                String exchange = envelope.getExchange();//交换机的信息
                String routingKey = envelope.getRoutingKey();//routingKey的信息
                System.out.println("收到的消息的编号为:" + deliveryTag);
                System.out.println("收到的消息的所属的为:" + exchange);
                System.out.println("收到的消息所属的队列为:" + routingKey);

                //保存消息到数据库
            }
        };

        //消息监听
        /**
         * 1.监听队列的名字
         * 2.是否自动确认消息
         */
        channel.basicConsume("simple_queue", true, defaultConsumer);
        //关闭资源(不建议关闭,建议一直监听消息)
    }
}

在这里插入图片描述

已经消费

在这里插入图片描述

广播模式

package com.mq.pruducer;

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

/**
 * @Author: 广播模式生产者
 * @Date: 2024/01/29/15:58
 * @Description: good good study,day day up
 */
public class FanoutProducer {

    /**
     * 广播模式消息的生产者发送消息
     * @param args
     */
    public static void main(String[] args) throws Exception{
        //创建连接工厂对象
        ConnectionFactory connectionFactory = new ConnectionFactory();
        //设置RabbitMQ服务主机地址,默认localhost
        connectionFactory.setHost("192.168.3.123");
        //设置RabbitMQ服务端口,默认5672
        connectionFactory.setPort(5672);
        //设置虚拟主机名字,默认/
        connectionFactory.setVirtualHost("/mqname1");
        //设置用户连接名,默认guest
        connectionFactory.setUsername("admin");
        //设置连接密码,默认guest
        connectionFactory.setPassword("admin");
        //创建连接
        Connection connection = connectionFactory.newConnection();
        //创建频道
        Channel channel = connection.createChannel();
        //声明队列
        /**
         * 1.队列的名字
         * 2.持久化
         * 3.是否独占队列
         * 4.在本次连接释放以后,是否删除队列---临时表
         * 5.队列的附加属性
         */
        channel.queueDeclare("fanout_queue_1", true, false, false, null);
        channel.queueDeclare("fanout_queue_2", true, false, false, null);

        //声明交换机
        /**
         * 1.交换机的名字
         * 2.交换机的类型
         */
        channel.exchangeDeclare("fanout_exchange", BuiltinExchangeType.FANOUT);

        //绑定
        /**
         * 1.队列
         * 2.交换机
         * 3.routingkey
         */
        channel.queueBind("fanout_queue_1", "fanout_exchange", "");
        channel.queueBind("fanout_queue_2", "fanout_exchange", "");

        for (int i = 0; i < 10; i++) {
            //创建消息
            String message = "这是广播模式的第" + i + "条消息!";
            //消息发送
            /**
             * 1.交换机
             * 2.routingkey是什么:简单模式下和队列的名字保持一致
             * 3.消息的附加属性是什么
             * 4.消息的内容是什么
             */
            if(i % 3  == 0){
                channel.basicPublish("fanout_exchange","", null, message.getBytes());
            }else{
                channel.basicPublish("fanout_exchange","", null, message.getBytes());
            }

            //关闭资源
        }
        channel.close();
        connection.close();
    }
}

消费者

package com.mq.consumer;

import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * @Author: 广播模式消费者1
 * @Date: 2024/01/29/16:03
 * @Description: good good study,day day up
 */
public class FanoutConsumer1 {


    /**
     * 广播模式消息消费者接受消息
     * @param args
     */
    public static void main(String[] args) throws Exception{
        //创建连接工厂对象
        ConnectionFactory connectionFactory = new ConnectionFactory();
        //设置RabbitMQ服务主机地址,默认localhost
        connectionFactory.setHost("192.168.3.123");
        //设置RabbitMQ服务端口,默认5672
        connectionFactory.setPort(5672);
        //设置虚拟主机名字,默认/
        connectionFactory.setVirtualHost("/mqname1");
        //设置用户连接名,默认guest
        connectionFactory.setUsername("admin");
        //设置连接密码,默认guest
        connectionFactory.setPassword("admin");
        //创建连接
        Connection connection = connectionFactory.newConnection();
        //创建频道
        Channel channel = connection.createChannel();
        //声明队列
        /**
         * 1.队列的名字
         * 2.持久化
         * 3.是否独占队列
         * 4.在本次连接释放以后,是否删除队列---临时表
         * 5.队列的附加属性
         */
        channel.queueDeclare("fanout_queue_1", true, false, false, null);
        //创建消费者,并设置消息处理:自定义的操作
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
            /**
             * 真实自定义处理消息的逻辑
             * @param consumerTag:消息的标签
             * @param envelope:消息的属性:消息属于哪个交换机发来的, 消息数据哪个队列=消息routingkey是什么,消息的编号
             * @param properties
             * @param body:消息的内容
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String s = new String(body, "UTF-8");
                System.out.println("收到的消息的内容为:" + s);
                long deliveryTag = envelope.getDeliveryTag();//消息的编号
                String exchange = envelope.getExchange();//交换机的信息
                String routingKey = envelope.getRoutingKey();//routingKey的信息
                System.out.println("收到的消息的编号为:" + deliveryTag);
                System.out.println("收到的消息的所属的为:" + exchange);
                System.out.println("收到的消息所属的队列为:" + routingKey);

                //保存消息到数据库
            }
        };

        //消息监听
        /**
         * 1.监听队列的名字
         * 2.是否自动确认消息
         */
        channel.basicConsume("fanout_queue_1", true, defaultConsumer);
        //关闭资源(不建议关闭,建议一直监听消息)
    }
}

package com.mq.consumer;

import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * @Author: 广播模式消费者2
 * @Date: 2024/01/29/16:03
 * @Description: good good study,day day up
 */
public class FanoutConsumer2 {


    /**
     * 广播模式消息消费者接受消息
     * @param args
     */
    public static void main(String[] args) throws Exception{
        //创建连接工厂对象
        ConnectionFactory connectionFactory = new ConnectionFactory();
        //设置RabbitMQ服务主机地址,默认localhost
        connectionFactory.setHost("192.168.3.123");
        //设置RabbitMQ服务端口,默认5672
        connectionFactory.setPort(5672);
        //设置虚拟主机名字,默认/
        connectionFactory.setVirtualHost("/mqname1");
        //设置用户连接名,默认guest
        connectionFactory.setUsername("admin");
        //设置连接密码,默认guest
        connectionFactory.setPassword("admin");
        //创建连接
        Connection connection = connectionFactory.newConnection();
        //创建频道
        Channel channel = connection.createChannel();
        //声明队列
        /**
         * 1.队列的名字
         * 2.持久化
         * 3.是否独占队列
         * 4.在本次连接释放以后,是否删除队列---临时表
         * 5.队列的附加属性
         */
        channel.queueDeclare("fanout_queue_2", true, false, false, null);
        //创建消费者,并设置消息处理:自定义的操作
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
            /**
             * 真实自定义处理消息的逻辑
             * @param consumerTag:消息的标签
             * @param envelope:消息的属性:消息属于哪个交换机发来的, 消息数据哪个队列=消息routingkey是什么,消息的编号
             * @param properties
             * @param body:消息的内容
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String s = new String(body, "UTF-8");
                System.out.println("收到的消息的内容为:" + s);
                long deliveryTag = envelope.getDeliveryTag();//消息的编号
                String exchange = envelope.getExchange();//交换机的信息
                String routingKey = envelope.getRoutingKey();//routingKey的信息
                System.out.println("收到的消息的编号为:" + deliveryTag);
                System.out.println("收到的消息的所属的为:" + exchange);
                System.out.println("收到的消息所属的队列为:" + routingKey);

                //保存消息到数据库
            }
        };

        //消息监听
        /**
         * 1.监听队列的名字
         * 2.是否自动确认消息
         */
        channel.basicConsume("fanout_queue_2", true, defaultConsumer);
        //关闭资源(不建议关闭,建议一直监听消息)
    }
}

广播模式队列
在这里插入图片描述
广播模式交换机

在这里插入图片描述

7.springboot整合RabbitMQ

       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
            <version>2.3.4.RELEASE</version>
        </dependency>
server:
  port: 19012
spring:
  rabbitmq:
    host: 192.168.3.123
    port: 5672
    virtual-host: /mqname1
    username: admin
    password: admin

配置类

package com.mq.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Author: 配置类
 * @Date: 2024/01/29/16:37
 * @Description: good good study,day day up
 */
@Configuration
public class RabbitMQConfig {
    //创建队列
    @Bean("myQueue")
    public Queue myQueue(){
        return QueueBuilder.durable("springboot_queue").build();
    }

    //创建交换机
    @Bean("myExchange")
    public Exchange myExchange(){
        return ExchangeBuilder.topicExchange("springboot_exchange").build();
    }

    //创建绑定
    @Bean
    public Binding myBinding(@Qualifier("myQueue") Queue myQueue,
                             @Qualifier("myExchange") Exchange myExchange){
        return BindingBuilder.bind(myQueue).to(myExchange).with("user.#").noargs();
    }
}

发送消息测试

package com.mq.controller;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author: 测试类
 * @Date: 2024/01/29/13:36
 * @Description: good good study,day day up
 */
@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    private RabbitTemplate rabbitTemplate;


    @RequestMapping("/one")
    public String one(){
        rabbitTemplate.convertAndSend("springboot_exchange","user.insert","1新增类型的消息");
        rabbitTemplate.convertAndSend("springboot_exchange","user.update","2修改类型的消息");
        rabbitTemplate.convertAndSend("springboot_exchange","user.delete","3删除类型的消息");
        return "发送成功";
    }

}

新建一个监听服务

package com.listener;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * @Author: 监听类mq
 * @Date: 2024/01/29/17:19
 * @Description: good good study,day day up
 */
@Component
public class MessageListener {
    /**
     * 监听某个队列的消息
     * @param message 接收到的消息
     */
    @RabbitListener(queues = "springboot_queue")
    public void myListener1(String message){
        System.out.println("消费者接收到的消息为:" + message);
    }
}

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

ToF传感器在移动机器人中的作用

原创 | 文 BFT机器人 在日新月异的机器人技术领域&#xff0c;技术的无缝整合正引领着人类与机器交互方式的革新潮流。ToF传感器作为变革性创新的一个例子&#xff0c;对移动机器人更好地感知周围环境起到了决定性的作用。 ToF传感器与激光雷达技术在创建深度图方面有着异曲同…

关于虚拟机ubuntu系统无法上网问题

一、虚拟机的连接方式 1、查看自己虚拟机的网络连接方式 选择虚拟机->右键设置->网络适配器 2、拓展——虚拟机的三种网络模式 2.1 首先安装虚拟机后&#xff0c;可以看到主机网络适配器多2张网卡 2.2 在VMware虚拟机中查看网络设置 点击菜单栏编辑 -> 虚拟网络…

C#,数据检索算法之三元搜索(Ternary Search)的源代码

数据检索算法是指从数据集合&#xff08;数组、表、哈希表等&#xff09;中检索指定的数据项。 数据检索算法是所有算法的基础算法之一。 本文发布 三元搜索&#xff08;Ternary Search&#xff09;的源代码。 1 文本格式 using System; namespace Legalsoft.Truffer.Algo…

Linux下安装edge

edge具有及其强大的功能&#xff0c;受到很多人的喜爱&#xff0c;它也开发Linux版本&#xff0c;下面是安装方法&#xff1a; 1.去edge官网下载Linux(.deb)文件。 https://www.microsoft.com/zh-cn/edge/download?formMA13FJ 2.下载之后输入以下指令&#xff08;后面是安装…

华为radius认证

组网需求 如图1所示&#xff0c;用户同处于huawei域&#xff0c;Router作为目的网络接入服务器。用户需要通过服务器的远端认证才能通过Router访问目的网络。在Router上的远端认证方式如下&#xff1a; Router对接入用户先用RADIUS服务器进行认证&#xff0c;如果认证没有响应…

c#窗体捕捉方向键

方法1 实现方法参考代码&#xff1a; private void Form1_Load(object sender, EventArgs e){this.KeyPreview true;}protected override bool ProcessDialogKey(Keys keyData){if (keyData Keys.Left || keyData Keys.Right || keyData Keys.Up || keyData Keys.Down){s…

SpringBoot+SqlServer查询接口

SpringBootSqlServer查询接口 文章目录 SpringBootSqlServer查询接口1. pom环境配置2. common工具包3. 实体类接口映射4. Service层Controller层 需求&#xff1a;根据站号查询前一个小时的所有数据&#xff0c;将数据返回格式为Map<String,List<Map<String,String>…

Java基于SpringBoot+Vue的网上超市管理系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Linux的bash命令语法

可用点 #!/bin/bash # 文件要以上面开始,.sh结尾的文件不需要# 赋权文件可执行权限 chmod x <fileName># 获取java jar包启动的进程id ps -ef | grep *.jar | grep -v grep | awk {print $2}shell变量 变量命令规则&#xff1a; 只能包含字母、数字、下划线&#xff1…

jsjiami.v6加解密教学

1. 优点 a. 安全性提升 JavaScript 加密可以有效保护源代码&#xff0c;减少恶意用户的攻击风险。 b. 代码混淆 通过混淆技术&#xff0c;可以使代码变得难以阅读和理解&#xff0c;增加破解的难度。 c. 知识产权保护 对于商业项目&#xff0c;JavaScript 加密有助于保护…

GLOBALCHIP GC3909Pin to Pin兼容A3909/allegro电机驱动芯片产品参数分析,应用于摇头机,舞台灯,打印机,白色家电等

GLOBALCHIP GC3909 12V H 桥驱动器芯片替代A3909/Allegro产品概述: GC3909是一款双通道12V直流电机驱动芯片&#xff0c;为摄像机、消费类产品、玩具和其他低压或者电池供电的运动控制类应用提供了集成的电机驱动解决方案。芯片一般用来驱动两个直流电机或者驱动一个步进电机。…

RX-8571SA/NB/LC实时时钟模块规格书

. 内置 32.768 kHz 晶体单元(频率精度调整完毕) .接口类型&#xff1a;I2C-Bus 接口 (400 kHz) .工作电压范围&#xff1a;1.6 V ~ 5.5 V .计时&#xff08;保持&#xff09; 电压范围&#xff1a;1.3 V ~ 5.5 V .低待机电流&#xff1a;220 nA (Typ.) / 3 V .32.768 k…

pod部署prometheus

1、部署node-exporter 2、收集节点信息 curl -Ls http://20.0.0.17:9100/metrics | grep node_cpu_seconds curl -Ls http://20.0.0.37:9100/metrics | grep node_cpu_seconds curl -Ls http://20.0.0.47:9100/metrics | grep node_cpu_seconds 3、创建账号&#xff0c;管理…

【基础算法】1、快速排序快速选择

快速排序思想&#xff1a; 1、找一个分界点。 2、在分界点两边开始调整范围。 3、递归两边&#xff0c;重复。 例题&#xff1a; 给定你一个长度为 n的整数数列。 请你使用快速排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行&#xf…

【软考问题】-- 5 - 知识精讲 - 项目进度管理

一、基本问题 项目进度管理&#xff08;按时完成&#xff09; 1&#xff1a;紧前关系绘图法&#xff1f; 定义&#xff1a;它是创建进度模型的一种技术。别称&#xff1a; PDM、前导图法、单代号网络图&#xff08;只有节点需要编号&#xff09;、活动节点图&#xff08;AON&a…

自动化测试系列 —— UI自动化测试!

UI 测试是一种测试类型&#xff0c;也称为用户界面测试&#xff0c;通过该测试&#xff0c;我们检查应用程序的界面是否工作正常或是否存在任何妨碍用户行为且不符合书面规格的 BUG。了解用户将如何在用户和网站之间进行交互以执行 UI 测试至关重要&#xff0c;通过执行 UI 测试…

git push后,如何撤销git log上的错误注释

修改了本地的代码&#xff0c;执行了下面的操作&#xff0c;提交之后&#xff0c;怎么样修改 git add ********(文件名)//git add 添加修改文件名之后 git commit //git commit 在当前分支提交&#xff0c;编写提交注释 git push //git push 提交修…

基于视觉的移载协作机器人机床上下料末端纠偏算法

摘 要 针对复合机器人在机床上下料中的定位方法,本文主要关注识别机床卡盘和末端作业面的定位。首先分 析了复合机器人在机床上下料过程中的工作原理及其基本结构,包括 AGV (自动导引车)和协作机器人 的功能及特点。然后,详细阐述了如何使用视觉系统和纠偏算法来…

合合信息TextIn服务使用心得

目录 一、前言二、TextIn简介2.1、通用文字识别2.2、国内通用票据识别2.3、通用表格识别 三、项目案例3.1、application.yml3.2、TextInService3.3、TextInController3.4、测试 四、总结 一、前言 智能图像处理、文字表格识别、文档内容提取产品的背景源自于人工智能技术的快速…

自动化测试的10大误区!

自动化测试因提高效率&#xff0c;减少重复工作的特性而被广泛采用。然而&#xff0c;随着自动化测试的普及&#xff0c;自动化测试也面临一系列挑战和误解。 这些误区不仅影响了测试的有效性&#xff0c;还会导致一定的项目风险&#xff0c;为了确保自动化测试能够真正提升测…