使用RabbitMQ实现简单消息队列

.NET CORE消息队列RabbitMQ RabbitMQ是一个开源的消息代理和队列服务器,用于在分布式系统中传递消息。它支持多种消息协议,提供可靠的消息传递、灵活的路由、集群和高可用性功能。 阅读详情

实现消息队列有多种框架,例如ActiveMQ、RabbitMQ、RocketMQ和Kafka,本文选择使用RabbitMQ实现简单的消息队列。

1 安装RabbitMQ

1.1 安装Erlang

下载Erlang,下载地址

https://www.erlang.org/downloads

默认安装即可(安装目录可自己选择)

 

1.2 安装RabbitMQ

(1)下载RabbitMQ,下载地址

https://www.rabbitmq.com/download.html

默认安装即可(安装目录可自己选择)

 

(2)安装和配置插件

先进入rabbitmq的sbin目录,再进入cmd,输入如下命令

rabbitmq-plugins enable rabbitmq_management

 

(3)查看RabbitMQ是否安装成功

输入以下命令

rabbitmqctl status

 

(3)启动RabbitMQ

(4)进入RabbitMQ

在浏览器中输入地址:http://127.0.0.1:15672/#/

初始化账号:guest,密码:guest

 

2 SpringBoot实现RabbitMQ

简单实现了Direct Exchange、Fanout Exchange、Topic Exchange三种消息模式

github地址:https://github.com/MasonYyp/rabbitmq

工程目录如下:

运行结果如下:

2.1 DirectModel

(1)ConfigQueueDirect

package com.example.mq.service.DirectModel;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class ConfigQueueDirect {

    // 管理员消息队列
    @Bean
    public Queue createAdmin(){
        // 创建消息队列,true代表持久化
        return new Queue("adminDirect", true);
    }

    // 用户消息队列
    @Bean
    public Queue createUser(){
        return new Queue("userDirect", true);
    }

}

(2)MessageConsumerDirect

package com.example.mq.service.DirectModel;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Service;


/*
 * 消息消费者
 * */


@Service
public class MessageConsumerDirect {

    @RabbitListener(queues = "adminDirect")
    public void adminReceiveMsg(String msg){
        System.out.println("adminDirect 消费者收到消息 "+msg);
    }

    @RabbitListener(queues = "userDirect")
    public void userReceiveMsg(String msg){
        System.out.println("userDirect 消费者收到消息 "+msg);
    }
}


(3)MessageProducerDirect

package com.example.mq.service.DirectModel;


import com.example.mq.util.MessageProducerInter;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.core.RabbitTemplate.ConfirmCallback;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


/*
* 消息生成者
* */

@Service("messageProducerDirect")
public class MessageProducerDirect implements MessageProducerInter, ConfirmCallback {


    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Override
    public void adminSend(String msg) {
        System.out.println("adminDirect 生产者发送信息 "+msg);
        // 回调
        this.rabbitTemplate.setConfirmCallback(this);
        this.rabbitTemplate.convertAndSend("adminDirect", msg);
    }

    @Override
    public void userSend(String msg) {
        System.out.println("userDirect 生产者发送信息  "+msg);
        // 回调
        this.rabbitTemplate.setConfirmCallback(this);
        this.rabbitTemplate.convertAndSend("userDirect", msg);
    }


    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        // 确认接收成功
        if(ack){
            System.out.println("Message 接收成功!");
        }else {
            System.out.println("Message 接收失败!" + cause);
        }
    }
}
 

2.2 TopicModel

(1)ConfigQueueTopic

package com.example.mq.service.TopicModel;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class ConfigQueueTopic {

    // 管理员消息队列
    @Bean(name = "adminQue")
    public Queue createAdmin(){
        // 创建消息队列,true代表持久化
        return new Queue("adminTopic", true);
    }

    // 用户消息队列
    @Bean(name = "userQue")
    public Queue createUser(){
        return new Queue("userTopic", true);
    }


    // 创建交换机
    @Bean
    public TopicExchange exchange(){
        return new TopicExchange("exchange");
    }


    // 绑定交换机
    @Bean
    public Binding bindingAdminExchangeMessage(@Qualifier("adminQue") Queue message, TopicExchange exchange){
        return BindingBuilder.bind(message).to(exchange).with("adminTopic");
    }

    @Bean
    public Binding bindingUserExchangeMessage(@Qualifier("userQue") Queue message, TopicExchange exchange){
        return BindingBuilder.bind(message).to(exchange).with("userTopic");
    }

}
 

(2)MessageConsumerTopic

package com.example.mq.service.TopicModel;

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


/*
 * 消息消费者
 * */
@Service
public class MessageConsumerTopic {

    @RabbitListener(queues = "adminTopic")
    public void adminReceiveMsg(String msg){
        System.out.println("admin 消费者收到消息 topic "+msg);
    }

    @RabbitListener(queues = "userTopic")
    public void userReceiveMsg(String msg){
        System.out.println("user 消费者收到消息 topic "+msg);
    }
}
(3)MessageProducerTopic

package com.example.mq.service.TopicModel;


import com.example.mq.util.MessageProducerInter;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.core.RabbitTemplate.ConfirmCallback;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


/*
* 消息生成者
* */

@Service("messageProducerTopic")
public class MessageProducerTopic implements MessageProducerInter, ConfirmCallback {


    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Override
    public void adminSend(String msg) {
        System.out.println("admin 生产者发送信息 topic  "+msg);
        // 回调
        this.rabbitTemplate.setConfirmCallback(this);
        this.rabbitTemplate.convertAndSend("adminTopic", msg);
    }

    @Override
    public void userSend(String msg) {
        System.out.println("user 生产者发送信息 topic  "+msg);
        // 回调
        this.rabbitTemplate.setConfirmCallback(this);
        this.rabbitTemplate.convertAndSend("userTopic", msg);
    }


    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        // 确认接收成功
        if(ack){
            System.out.println("Message 接收成功!");
        }else {
            System.out.println("Message 接收失败!" + cause);
        }
    }
}
 

2.3 FanoutModel

(1)ConfigQueueFanout

package com.example.mq.service.FanoutModel;

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


@Configuration
public class ConfigQueueFanout {

    // 管理员消息队列
    @Bean(name = "adminQueFanout")
    public Queue createAdmin(){
        // 创建消息队列,true代表持久化
        return new Queue("adminFanout", true);
    }

    // 用户消息队列
    @Bean(name = "userQueFanout")
    public Queue createUser(){
        return new Queue("userFanout", true);
    }


    // 创建路由器
    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("fanoutExchange");
    }


    // 绑定路由器
    @Bean
    public Binding bindingAdminFanoutExchangeMessage(@Qualifier("adminQueFanout") Queue message, FanoutExchange fanoutExchange){
        // 不绑定key
        return BindingBuilder.bind(message).to(fanoutExchange);
    }

    @Bean
    public Binding bindingUserFanoutExchangeMessage(@Qualifier("userQueFanout") Queue message, FanoutExchange fanoutExchange){
        return BindingBuilder.bind(message).to(fanoutExchange);
    }

}

 

(2)MessageConsumerFanout

package com.example.mq.service.FanoutModel;

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


/*
 * 消息消费者
 * */
@Service
public class MessageConsumerFanout {

    @RabbitListener(queues = "adminFanout")
    public void adminReceiveMsg(String msg){
        System.out.println("adminFanout 消费者收到消息 "+msg);
    }

    @RabbitListener(queues = "userFanout")
    public void userReceiveMsg(String msg){
        System.out.println("userFanout 消费者收到消息 "+msg);
    }
}
 

(3)MessageProducerFanout

package com.example.mq.service.FanoutModel;


import com.example.mq.util.MessageProducerInter;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.core.RabbitTemplate.ConfirmCallback;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


/*
* 消息生成者
* */

@Service("messageProducerFanout")
public class MessageProducerFanout implements MessageProducerInter, ConfirmCallback {


    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Override
    public void adminSend(String msg) {
        System.out.println("adminFanout 生产者发送信息  "+msg);
        // 回调
        this.rabbitTemplate.setConfirmCallback(this);
        this.rabbitTemplate.convertAndSend("adminFanout", msg);
    }

    @Override
    public void userSend(String msg) {
        System.out.println("userFanout 生产者发送信息 "+msg);
        // 回调
        this.rabbitTemplate.setConfirmCallback(this);
        this.rabbitTemplate.convertAndSend("userFanout", msg);
    }


    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        // 确认接收成功
        if(ack){
            System.out.println("Message 接收成功!");
        }else {
            System.out.println("Message 接收失败!" + cause);
        }
    }
}

 

(4)MessageQueFanoutTest

package com.example.mq;

import com.example.mq.util.MessageProducerInter;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;


@SpringBootTest
public class MessageQueFanoutTest {

    @Autowired
    @Qualifier("messageProducerFanout")
    private MessageProducerInter messageProducer;

    @Test
    public void test() throws InterruptedException {
        for (int i=0; i<10; i++){

            this.messageProducer.adminSend(" "+i);
            this.messageProducer.userSend(" "+i);

            Thread.sleep(1000);
        }
    }
}
 


 

Golang之消息队列——RabbitMQ的使用 消息队列的使用场景 异步处理       异步是指不用一次性执行完,可以先去执行别的,等这边回应了再做处理。这里我就拿一个网上用烂的例子:用户注册。用户在正确填写信息后点击注册,这时会发起网络请求到后端去做数据合法性等的验证,一旦验证通过则会将数据写入数据库并返回注册成功类的信息。但现在很多的应用都会有短信、邮箱等其他媒介的额外通知,这些... 阅读详情

相关推荐

Kettle整合Rabbitmq消息队列

Kettle整合Rabbitmq消息队列一. 简介二. 环境准备三. Rabbitmq配置四. Kettle连接消息队列4.1 配置MQTT生产者4.2 配置消费者五. 测试 关于Rabbitmq消息队列知识可以参考我往期博客 一. 简介 Kettle没有直接的rabbitMQ步骤,但streaming类别下有MQTT步骤。rabbitMQ默认使用amqp协议,但也可以启用MQTT插件,来使用MQTT协议。 因此,我们使用Kettle通过MQTT协议步骤来生产和消费rabbitMQ。 二. 环境准备 我的测

木讷的鱼 6424

SpringBoot中 RabbitMQ 动态添加Queue和Listener

之前项目中涉及了动态配置Queue name的需求,但是解决了一直没有记录,今天看到了顺便记录下。首先声明一个Queue的bean,这里面你就可以拼接你想要的queue的name。然后就是写Listener了,注册监听该Queue。这里True的意思是一个持久的Queue。

Damien_J_Scott的博客 2332

Golang消息队列RabbitMQ应用详解

本文旨在为Golang开发者提供RabbitMQ的全面指南,从基础概念到高级应用,帮助开发者理解并掌握在Golang项目中使用RabbitMQ进行异步通信和系统解耦的技术。本文将按照从理论到实践的路径组织内容,首先介绍RabbitMQ的核心概念,然后展示Golang中的具体实现,最后探讨高级特性和最佳实践。消息队列(Message Queue): 一种应用程序间通信的方法,消息发送后可以立即返回,由消息系统确保消息的可靠传递: RabbitMQ使用的开放标准应用层协议生产者(Producer)

AI Agent Harness Engineering 1199

RabbitMQ:Queue的介绍和使用

1.声明 当前内容用于本人学习和使用当前的Queue,当前内容为RabbitMQ中对Queue的介绍 当前内容来源:RabbitMQ中的Queue 2.Queue的官方介绍 首先先分析以下前面的Queue的使用,其实这个东西就是一个队列,一个存储消息的队列,并且可以持久化,而且这个队列中的消息可以被消费,如果出现死信则是死信队列,死信队列也是可以被处理的 接下来就是官方介绍 Queues in the AMQP 0-9-1 model are very similar to queues in other

编程学习者的博客 7649

基于FPGA的PCIe核系列:FPGA root模式生成工程例子分析(1)

一、 PCIE系统架构 1.1 PCIE分层结构 PCIE结构 1.2 TLP包 四种TLP类型。 Memory (内存空间操作) IO (IO空间操作) Configuration (配置操作) Message (信息操作) 四种类型TLP,如果有需要响应,称为Non-Posted TLP,如果没有需要响应,称为Posted TLP。 TLP包类型 1.2.1 TLP结构 TLP数据格式 1.2.2 Header各个字段的含义 Header格式 ...

huangshanhu的博客 3433

深入解析西门子S7通信协议:从抓包到实战应用

本文深入解析西门子S7通信协议,从环境搭建、抓包分析到实战应用,提供了一套完整的协议分析方法。通过Wireshark工具进行抓包分析,详细拆解了S7协议各层结构,并结合真实案例,展示了如何利用抓包技术解决通信故障、优化性能及进行安全审计,是掌握工业通信底层原理的实用指南。

weixin_29224529的博客 282

RabbitMQ-Queue

主要讨论队列声明的各个参数(本文基于SpringBoot集成) 1.通过RabbitMQ-Manager界面添加queue设置参数 2.通过Bena注入添加queue设置参数 @Configuration public class RabbitmqConfig { @Bean public Queue queueWork_test() { return new Queue("queue_work_test", true, false, false, null); }

zmj199536的博客 1220

Dify搭建AI测试用例生成器

1、获取产品需求文档2、解读、分析、挖掘需求点,提炼为测试点3、依据测试点,生成详细的测试用例4、输出测试用例1、打开 Dify 控制台,依次点击【工作室】-【ChatFlow】-【创建空白应用】。

十二测试录 1371

RabbitMQ学习笔记

rabbitMQ 1 RabbitMQ简介 MQ(Message Quene) : 翻译为 消息队列,通过典型的 生产者和消费者模型,生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。 因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,轻松的实现系统间解耦。 别名为 消息中间件 通过利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。 当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ,炙手可热的Ka

小小猿的博客 500

FANUC机器人_CRX协作机器人的开机和示教器的初始化设置基本步骤(二)

FANUC机器人_CRX协作机器人的开机和示教器的初始化设置基本步骤

Robot_PLC_HMI_Automation 2732

Python 实战:全面解析“微信搜一搜”内容爬取,从入门到企业级架构

本文将带你从零搭建爬虫项目,采用 Requests、Scrapy、Selenium、Proxy 池、中间人监控(如 Fiddler/mitmproxy)、分布式调度、数据库持久化、断点续抓等方案,实现可持续、抗封能力强的内容抓取系统。理解“微信搜一搜”页面结构与 Javascript 渲染逻辑;使用 Scrapy 框架搭建分布式爬虫;使用 Selenium 模拟浏览器抓取;构建代理池提升爬取成功率;对抗验证码、IP 封禁与 cookie 过期问题;

2201_76125261的博客 1393

RabbitMQ消息队列——快速入门

RabbitMQ是由erlang语言开发,基于AMQP协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。RabbitMQ官方地址:RabbitMQ的架构图不直接Exchange交换机(默认交换机)simple简单模式: 一个生产者、一个消费者,生产者生产消息到一个队列被一个消费者接收work Queue工作队列模式: 一个生产者、多个消费者(竞争关系),生产者发送消息到一个队列中,可以被多个消费者监听该队列;

程序员阿龙的博客 3928

高可用架构设计——多节点OpenClaw集群部署与负载均衡(2026企业级)

本文介绍了企业级OpenClaw高可用集群架构设计,重点阐述了多节点部署与负载均衡方案。架构采用分层设计,包括表现层、应用层、数据层和基础设施层,确保99.99%的可用性目标。详细配置了主节点、工作节点和存储节点规格,提供Kubernetes集群部署脚本示例,实现自动化的容器编排管理。通过硬件冗余、故障隔离和弹性扩展等可靠性原则,构建能够应对各种故障场景的稳定AI助手系统。

博客 421

RabbitMQ消息队列

一个生产者多个消费者,每个消费者都有自己的队列,生产者没有吧消息直接发送到队列,而是发送到了交换机,每个队列都绑定到交换机,生产者发送的消息,经过交换机,到达队列,实现,一个消息被多个消费者获取的目的。RabbitMQ作为一个消息代理,主要负责接收、存储和转发消息,它提供了可靠的消息机制和灵活的消息路由,并支持消息集群和分布式部署,常用于应用解耦,耗时任务队列,流量削锋等场景。消息发送到没有队列绑定的交换机时,消息将丢失,因为,交换机没有存储消息的能力,消息只能存在在队列中。结果:根据key值进行处理。

weixin_62008675的博客 1327

HyperLynx(十八)DDR(一)DDR简介和DDR的数据仿真

LVTTL电平为单端信号,而SSTL电平本质上是差分对,其实现机制是将信号与参考电平Vref组成差分对进行比较,如图所示,VIH和VIL各有一个交流参数AC和直流参数DC,信号第一次越过AC门限的时刻,作为时序计算的参考点,此后只要信号保持DC门限内,逻辑状态保持不变,这种设计减小了噪声、振铃等对于信号质量的影响。经过调整后,控制器在发送颗粒1的DQS后,延时1ns再发送颗粒2的DQS,则颗粒1在1ns后收到对齐的DQS和CLK,颗粒2在2ns后收到对齐的DQS和CLK,从而满足了时序关系。

小幽余生不加糖 7677

2026年03月CCF-GESP编程能力等级认证C++编程一级真题解析

本文收录于专栏《。订阅后可阅读专栏内所有文章。

人生就是一个不断学习的过程 337

带你了解RabbitMQ消息队列

RabbitMQ是一款在全球范围内使用非常广泛的开源消息队列中间件。它轻量级、易部署、并支持多种协议。它基于Erlang开发,天生拥有高并发的能力。(1) 超级管理员(administrator):guest可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。(2) 监控者(monitoring)

专注于系统运维、数据库、DevOps、虚拟化技术、docker、kubernetes、等云原生技术。 1230

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

RabbitMQ 消息队列

什么是 RabbitMQ MQ(Message Queue)消息队列 消息队列中间件,是分布式系统中的重要组件; 主要解决异步处理、应用解耦、流量削峰等问题,从而实现高性能,高可用,可伸缩和最终一致性的架构。 使用较多的消息队列产品:RabbitMQ,RocketMQ,ActiveMQ,ZeroMQ,Kafka 等。 异步处理 用户注册后,需要发送验证邮箱和手机验证码。 将注册信息写入数据库,发送验证邮件,发送手机,三个步骤全部完成后,返回给客户端。 传统: 客户端 <-> 注

bier_zm的博客 4744

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

消息队列RabbitMQ

消息队列就是应用程序相互通信的中间件。

门牙咬脆骨的奋斗日志 1747

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

消息队列—RabbitMQ(万字详解)

在基于微服务开发的电商项目中,商品的查询和商品的修改是通过两个服务实现的,如果修改了商品的价格,如何保证商品查询服务查询出来的商品价格同步更新呢?同步调用➢ A服务调用B服务,需要等待B服务执行完毕的返回值,A服务才可以继续往下执行。和RPC(Dubbo)实现同步调用。异步调用➢ A服务调用B服务,而无需等待B服务的执行结果,也就是说在B服务执行的同时A服务可以继续往下执行。➢ 通过:消息队列实现异步调用。 MQ全称为Message Queue,消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通

How many ten years in the life time? 6343

【黑马点评】 使用RabbitMQ实现消息队列——2.使用RabbitMQ监听秒杀下单

黑马点评之使用RabbitMQ实现消息队列

m0_52031708的博客 5626

RabbitMQ消息队列实现异步

RabbitMQ 介绍 消息队列是典型的:生产者消费者模型 生产者不断向消息队列生产消息,消费者不断从队列中获取消息。消息的生产和获取都是异步的,只关心消息的发送和接收,没有业务逻辑的侵入,实现了生产者和消费者的解耦 端口:5672 界面版端口:15672 常见MQ产品 ActiveMQ:基于JMS RabbitMQ:基于AMQP协议,erlang语言开发,稳定性好 RocketMQ:基于JMS,阿里巴巴产品,目前交由Apache基金会 Kafka:分布式消息系统,高吞吐量 RabbitMQ消息类型

weixin_45964104的博客 4418

消息队列之rabbitmq

RabbitMQ是一个开源的消息队列系统,它实现了高度可靠的消息传递机制,用于支持应用程序之间的异步通信。RabbitMQ基于AMQP(Advanced Message Queuing Protocol)协议,并提供了丰富的特性和灵活的配置选项。

CherryXieのblog 1940

消息队列——rabbitMQ

消息队列——rabbitMQ

u013930876的博客 1485
上一篇: win10访问共享文件夹失败
下一篇: html实现div在同一行
MasonYyp
博客等级 码龄9年 301粉丝 297原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值