RabbitMQ--04--发布订阅模式 (fanout)-案例

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 发布订阅模式 (fanout)---案例
    • 前言
      • @RabbitListener和@RabbitHandler的使用
    • 1.通过Spring官网快速创建一个RabbitMQ的生产者项目
    • 2.导入项目后在application.yml文件中配置
    • 3.创建一个RabbitMqConfig配置类
    • 4. 生产者
    • 5.测试生产者创建mq是否成功
        • 访问网址: http://localhost:15672/#/queues
    • 6.再创建一个消费者项目
    • 7. 创建消费者
    • 8.测试消费者接收信息


发布订阅模式 (fanout)—案例

前言

在这里插入图片描述
在这里插入图片描述

@RabbitListener和@RabbitHandler的使用

在这里插入图片描述
在这里插入图片描述

1.通过Spring官网快速创建一个RabbitMQ的生产者项目

在这里插入图片描述

2.导入项目后在application.yml文件中配置

# 服务端口
server:
  port: 8081
  
#配置rabbitmq服务 测试不用写,默认本机
spring:
  rabbitmq:
      username: guest #默认账号
      password: guest #默认密码
      virtual-host: /
      host: localhost
      port: 5672
      #消息确认配置项
      #确认消息已发送到交换机: Exchange
      publisher-confirm-type: correlated
      #确认消息已发送到队列: Queue
      publisher-returns: true


3.创建一个RabbitMqConfig配置类

package com.exam.RebbitMQ.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMqConfig {

	//1:声明注册fanout模式的交换机,参数1:对应的service的fanoutName,参数2:持久化(true,false),参数3:自动删除(false/true)
	@Bean
	public FanoutExchange fanoutExchange(){
		return new  FanoutExchange("fanout_order_exchang", true, false);
	}
	//2:声明队列 sms.fanout.queue,email.fanout.queue,duanxin.fanout.queue
	//参数1:名字,参数2:持久化队列true
	//短信队列
	@Bean
	public Queue smsQueue() {
		System.err.println("执行了sms");
		return new Queue("sms.fanout.queue",true);
	}
	@Bean
	public Queue duanxinQueue() {
		System.err.println("执行了duanxin");
		return new Queue("duanxin.fanout.queue",true);
	}
	//邮箱队列
	@Bean
	public Queue emailQueue() {
		System.err.println("执行了email");
		return new Queue("email.fanout.queue",true);
	}
	//3:完成绑定关系(队列和交换机完成绑定关系)
	@Bean
	public Binding smsBinding() {
		//把smsQueue放到fanoutExchange交换机上面
		return BindingBuilder.bind(smsQueue()).to(fanoutExchange());
	}
	@Bean
	public Binding duanxinBinding() {
		//把duanxinQueue放到fanoutExchange交换机上面
		return BindingBuilder.bind(duanxinQueue()).to(fanoutExchange());
	}
	@Bean
	public Binding emailBinding() {
		//把emailQueue放到fanoutExchange交换机上面
		return BindingBuilder.bind(emailQueue()).to(fanoutExchange());
	}

}

4. 生产者

  • OrderService
package com.exam.RebbitMQ.service;

public interface OrderService {
	void makeOrder(String userid,String productid,int num);
}

  • OrderServiceImpl
    在这里插入图片描述
package com.exam.RebbitMQ.service.Impl;

import java.util.UUID;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.exam.RebbitMQ.service.OrderService;

@Service
public class OrderServiceImpl implements OrderService{
	
	@Autowired
	private RabbitTemplate rabbitTemplate;
	
	/**
	 * 模拟用户下单 
	 **/
	public void makeOrder(String userid,String productid,int num) {
		//1.根据商品ID查询商品是否充足
		//2.保存订单
		String  orderId = UUID.randomUUID().toString();
		System.err.println("订单生成成功"+orderId);
		//3.通过MQ来完成消息的分发
		//参数1:交换机 参数二:路由key/queue队列名称  参数三:消息内容
		String  exchangName ="fanout_order_exchang";
		String routingKey = "";
		rabbitTemplate.convertAndSend(exchangName, routingKey, orderId);
	}

}


5.测试生产者创建mq是否成功

  • 在项目的test中发送请求
package com.huyi.rabbitmq;

import com.huyi.rabbitmq.service.OrderService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class RabbitMqApplicationTests {

	@Autowired
	private OrderService orderService;

	@Test
	void contextLoads() {
		orderService.makeOrder("1","1", 18);
	}

}


在这里插入图片描述

访问网址: http://localhost:15672/#/queues

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.再创建一个消费者项目

在这里插入图片描述

  • yml配置
# 服务端口
server:
  port: 8082

#配置rabbitmq服务 测试不用写,默认本机
spring:
  rabbitmq:
    username: guest #默认账号
    password: guest #默认密码
    virtual-host: /
    host: localhost
    port: 5672
    #消息确认配置项
    #确认消息已发送到交换机: Exchange
    publisher-confirm-type: correlated
    #确认消息已发送到队列: Queue
    publisher-returns: true


7. 创建消费者

  • SmsConsumerService、SmsConsumerServiceImpl
package com.huyi.rabbitmq_consumber.service;

public interface SmsConsumerService {
    void reviceMessage(String message);
}
package com.huyi.rabbitmq_consumber.service.Impl;

import com.huyi.rabbitmq_consumber.service.SmsConsumerService;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

@Component
public class SmsConsumerServiceImpl implements SmsConsumerService {

    //注意:这里要和生产者RabbitMqConfig文件中的名字对应起来
    @RabbitListener(queues = {"sms.fanout.queue"})
    public void reviceMessage(String message) {
        System.err.println("sms_fanout--接收到了订单信息");
    }
}


  • EmailConsumerService、EmailConsumerServiceImpl
package com.huyi.rabbitmq_consumber.service;

public interface EmailConsumerService {
    void reviceMessage(String message);
}

package com.huyi.rabbitmq_consumber.service.Impl;

import com.huyi.rabbitmq_consumber.service.EmailConsumerService;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

@Component
@RabbitListener(queues = {"email.fanout.queue"})
public class EmailConsumerServiceImpl implements EmailConsumerService {
    @RabbitHandler
    public void reviceMessage(String message) {
        System.err.println("Email_fanout--接收到了订单信息"+message);
    }
}


  • DuanxinConsumerService、DuanxinConsumerServiceImpl
package com.huyi.rabbitmq_consumber.service;

public interface DuanxinConsumerService {
    void reviceMessage(String message);
}


package com.huyi.rabbitmq_consumber.service.Impl;


import com.huyi.rabbitmq_consumber.service.DuanxinConsumerService;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

@Component
@RabbitListener(queues = {"duanxin.fanout.queue"})
public class DuanxinConsumerServiceImpl implements DuanxinConsumerService {
    @RabbitHandler
    public void reviceMessage(String message) {
        System.err.println("Duanxin_fanout--接收到了订单信息"+message);
    }

}


8.测试消费者接收信息

  • 启动消费者项目
    在这里插入图片描述
  • 启动生产者项目
    在这里插入图片描述
  • 查看消费者项目是否监听到了生产者的信息
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MSTP环路避免实验(华为)

思科设备参考:MSTP环路避免实验(思科) 一,技术简介 MSTP(多生成树协议),MSTP解决了STP和RSTP没有考虑vlan的问题,STP和RSTP将所有的vlan共享为一个生成树实例,无法实现…

数据链路层之信道:数字通信的桥梁与守护者

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

蓝桥杯刷题第五天(昨天刷了忘记更了)

思路: 用dp来记录最短消耗时间 dp[坐标][zhuangtai] 状态0表示在底部,状态1表示在传送门处; 先初始化dp[1][0] 和dp[1][1]然后循环遍历到dp[n][0] 和dp[n][1],用动态规划方程去赋值; ps:易错点在于要开…

基于spark的大数据分析预测地震受灾情况的系统设计

基于spark的大数据分析预测地震受灾情况的系统设计 在本篇博客中,我们将介绍如何使用Apache Spark框架进行地震受灾情况的预测。我们将结合数据分析、特征工程、模型训练和评估等步骤,最终建立一个预测模型来预测地震造成的破坏程度,同时使用可视化大屏的方式展示数据的分布…

CCF-CSP19<2020-06>-第1/2题

202006-1 线性分类器 题目分析: 给定n个点,并标记为AB两类,问给定直线是否能将其分为两个点集。 简单数学知识,点在直线上满足axbyc0,点在直线割平面所得的上下其值会正负相反。 AC代码: // -*- codin…

C++入门知识详细讲解

C入门知识详细讲解 1. C简介1.1 什么是C1.2 C的发展史1.3. C的重要性1.3.1 语言的使用广泛度1.3.2 在工作领域 2. C基本语法知识2.1. C关键字(C98)2.2. 命名空间2.2 命名空间使用2.2 命名空间使用 2.3. C输入&输出2.4. 缺省参数2.4.1 缺省参数概念2.4.2 缺省参数分类 2.5. …

日历插件fullcalendar【笔记】

日历插件fullcalendar【笔记】 前言版权开源推荐日历插件fullcalendar一、下载二、初次使用日历界面示例-添加事件,删除事件 三、汉化四、动态数据五、前后端交互1.环境搭建-前端搭建2.环境搭建-后端搭建3.代码编写-前端代码fullcalendar.htmlfullcalendar.js 4.代码…

【前端】layui前端框架学习笔记

【前端目录贴】 参考视频:LayUI 参考笔记:https://blog.csdn.net/qq_61313896/category_12432291.html 1.介绍 官网:http://layui.apixx.net/index.html 国人16年开发的框架,拿来即用,门槛低 … 2. LayUi的安装及使用 Layui 是一套开源的 Web UI 组件库&#xff0…

乐乐音乐鸿蒙版-支持krc歌词(动感歌词、翻译和音译歌词)

简介 乐乐音乐主要是基于HarmonyOS开发的音乐播放器,它支持lrc歌词和动感歌词(ksc歌词、krc歌词和hrc歌词等)、多种格式歌词转换器及制作动感歌词、翻译歌词和音译歌词。 开发环境 ArkTS、Stage模型、SDK3.1、 API 9 注:没试过在真机条件下调试。 功…

SpringCloud-Eureker配置中心搭建

一、基于本地配置文件的 Eureker配置中心搭建 1.、创建一个springBoot项目 <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.8</java.version><component.version>0.0.1-SNAPSHOT</…

机器学习:探索数据中的模式与智能

文章目录 导言介绍&#xff1a;机器学习的定义和重要性发展历程&#xff1a;从概念到现实应用 基础概念机器学习的基本原理监督学习、无监督学习和强化学习的区别与应用1.监督学习2.无监督学习3.强化学习 常见的机器学习任务和应用领域 结语 导言 当代科技领域中最为引人注目的…

两张图片相似度匹配算法学习路线

大纲&#xff1a;​​​​​​目标跟踪基础&#xff1a;两张图片相似度算法-腾讯云开发者社区-腾讯云 (tencent.com) 目标跟踪基础&#xff1a;两张图片相似度算法 (qq.com) 一、传统方法 1.欧式距离&#xff08;用于判断是否完全相同&#xff09; [三维重建] [机器学习] 图…

NC13610 矩阵

题目描述 给出一个n * m的矩阵。让你从中发现一个最大的正方形。使得这样子的正方形在矩阵中出现了至少两次。输出最大正方形的边长。 输入描述: 第一行两个整数n, m代表矩阵的长和宽&#xff1b; 接下来n行&#xff0c;每行m个字符&#xff08;小写字母&#xff09;&#x…

Java8 新特性 Stream流操作

数据准备 package test;/*** [一句话描述该类的功能]** author : [61692]* version : [v1.0]* createTime : [2024/3/31 14:52]*/ public class Student {private int id;private int age;private int yuwenScore;private int mathScore;private String name;private int yi…

c++初阶篇----string的底层模拟

string类的模拟 目录 string类的模拟功能介绍各功能的实现类的构造函数&#xff0c;拷贝构造函数&#xff0c;析构函数迭代器的实现string的内部容量访问成员函数string的修改成员函数string类的相关联函数string类的输入输出友元 汇总string功能的实现汇总测试代码 功能介绍 …

Vue3+.NET6前后端分离式管理后台实战(八)

1&#xff0c;Vue3.NET6前后端分离式管理后台实战(八)已经在订阅号发布有兴趣的可以关注一下&#xff01; 有兴趣的可以关注一下&#xff1a;

深入剖析Spring WebFlux:从MethodHandler到反射获取请求信息的源码之旅

文章目录 前言一、获取请求执行的类、方法信息二、获取请求url变量三、获取请求处理数据总结 前言 最近想写一个代办事项后台服务&#xff0c;底层&#xff0c;选型WebFlux。在操作层面上&#xff0c;针对部分操作&#xff0c;想在不侵入业务代码的前提下&#xff0c;记录操作…

泛型总结(擦除机制+泛型上界+通配符的上下界)

文章目录 泛型一、 什么是泛型1.能用于多种类型&#xff0c;把类型当做参数1.1 作用1.2 语法 二、擦除机制1. 为什么采用擦除机制实现泛型&#xff1f;向后兼容性 移植兼容性 2. 为什么不能使用“newT()”&#xff1f;3. 创建类型T的数组3.1 不安全的写法3.2 官方的写法 3. 3 正…

从0到1:兼职招聘小程序开发笔记(一)

可行性分析 兼职招聘小程序&#xff1a;为雇主和求职者提供便利的平台&#xff0c;旨在帮助雇主招聘兼职员工&#xff0c;并让求职者寻找合适的兼职工作。提供简单、快捷的方式来匹配兼职岗位和候选人&#xff0c;节省了招聘和求职的时间和精力。其主要功能模块包括&#xff1…