140_SpringBoot案例-fanout发布订阅模式

整体核心

140_SpringBoot案例-fanout发布订阅模式

目标

:::info
使用springboot完成rabbitmq的消费模式-Fanout
:::

140_SpringBoot案例-fanout发布订阅模式

实现步骤

:::info
1:创建生产者工程:springboot-rabbitmq-fanout-producer
2:创建消费者工程:springboot-rabbitmq-fanout-consumer
3:引入spring-boot-rabbitmq的依赖
4:进行消息的分发和测试
5:查看和观察web控制台的状况
:::

生产者

创建生产者工程:springboot-rabbitmq-fanout-producer

140_SpringBoot案例-fanout发布订阅模式

在pom.xml中引入依赖


    org.springframework.boot
    spring-boot-starter-amqp

    org.springframework.boot
    spring-boot-starter-web

在application.yml进行配置

服务端口
server:
  port: 8080
配置rabbitmq服务
spring:
  rabbitmq:
    username: admin
    password: admin
    virtual-host: /
    host: 47.104.141.27
    port: 5672

定义订单的生产者

package com.xuexiangban.rabbitmq.springbootrabbitmqfanoutproducer.service;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.UUID;
/**
 * @author: 学相伴-飞哥
 * @description: OrderService
 * @Date : 2021/3/4
 */
@Component
public class OrderService {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    // 1: 定义交换机
    private String exchangeName = "fanout_order_exchange";
    // 2: 路由key
    private String routeKey = "";
    public void makeOrder(Long userId, Long productId, int num) {
        // 1: 模拟用户下单
        String orderNumer = UUID.randomUUID().toString();
        // 2: 根据商品id productId 去查询商品的库存
        // int numstore = productSerivce.getProductNum(productId);
        // 3:判断库存是否充足
        // if(num >  numstore ){ return  "商品库存不足..."; }
        // 4: 下单逻辑
        // orderService.saveOrder(order);
        // 5: 下单成功要扣减库存
        // 6: 下单完成以后
        System.out.println("用户 " + userId + ",订单编号是:" + orderNumer);
        // 发送订单信息给RabbitMQ fanout
        rabbitTemplate.convertAndSend(exchangeName, routeKey, orderNumer);
    }
}

绑定关系

:::info
绑定关系方式有两种:一种是配置类,一种是注解@RabbitListener(bindings =@QueueBinding
推荐使用配置类
生产者和消费者中只需要一边添加配置类就可以了,建议消费者中添加,因为通常消费者先启动
:::

package com.xuexiangban.rabbitmq.springbootrabbitmqfanoutproducer.service;
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;
/**
 * @Author : JCccc
 * @CreateTime : 2019/9/3
 * @Description :
 **/
@Configuration
public class FanoutRabbitConfig {

    // 声明注册fanout模式的交换机
    @Bean
    public FanoutExchange fanoutOrderExchange() {
        return new FanoutExchange("fanout_order_exchange", true, false);
    }
    // 声明队列
    @Bean
    public Queue emailQueue() {
        // durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
        // exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
        // autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。
        //一般设置一下队列的持久化就好,其余两个就是默认false
        return new Queue("email.fanout.queue", true);
    }
    @Bean
    public Queue smsQueue() {
        // durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
        // exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
        // autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。
        //一般设置一下队列的持久化就好,其余两个就是默认false
        return new Queue("sms.fanout.queue", true);
    }
    @Bean
    public Queue weixinQueue() {
        // durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
        // exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
        // autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。
        //一般设置一下队列的持久化就好,其余两个就是默认false
        return new Queue("weixin.fanout.queue", true);
    }
    //绑定  将队列和交换机绑定
    @Bean
    public Binding emailBinding() {
        return BindingBuilder.bind(emailQueue()).to(fanoutOrderExchange());
    }
    @Bean
    public Binding smsBinding() {
        return BindingBuilder.bind(smsQueue()).to(fanoutOrderExchange());
    }
    @Bean
    public Binding weixinBinding() {
        return BindingBuilder.bind(weixinQueue()).to(fanoutOrderExchange());
    }
}

进行测试

package com.xuexiangban.rabbitmq.springbootrabbitmqfanoutproducer;
import com.xuexiangban.rabbitmq.springbootrabbitmqfanoutproducer.service.OrderService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringbootRabbitmqFanoutProducerApplicationTests {
    @Autowired
    OrderService orderService;
    @Test
    public void contextLoads() throws Exception {
        for (int i = 0; i < 10; i++) {
            Thread.sleep(1000);
            Long userId = 100L + i;
            Long productId = 10001L + i;
            int num = 10;
            orderService.makeOrder(userId, productId, num);
        }
    }
}

消费者

创建消费者工程:springboot-rabbitmq-fanout-consumer

140_SpringBoot案例-fanout发布订阅模式

引入依赖pom.xml


    org.springframework.boot
    spring-boot-starter-amqp

    org.springframework.boot
    spring-boot-starter-web

在application.yml进行配置

服务端口
server:
  port: 8081
配置rabbitmq服务
spring:
  rabbitmq:
    username: admin
    password: admin
    virtual-host: /
    host: 47.104.141.27
    port: 5672

消费者 – 邮件服务

package com.xuexiangban.rabbitmq.springbootrabbitmqfanoutconsumer.consumer;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component;
// bindings其实就是用来确定队列和交换机绑定关系
@RabbitListener(bindings =@QueueBinding(
        // email.fanout.queue 是队列名字,这个名字你可以自定随便定义。
        value = @Queue(value = "email.fanout.queue",autoDelete = "false"),
        // order.fanout 交换机的名字 必须和生产者保持一致
        exchange = @Exchange(value = "fanout_order_exchange",
                // 这里是确定的rabbitmq模式是:fanout 是以广播模式 、 发布订阅模式
                type = ExchangeTypes.FANOUT)
))
@Component
public class EmailService {
    // @RabbitHandler 代表此方法是一个消息接收的方法。该不要有返回值
    @RabbitHandler
    public void messagerevice(String message){
        // 此处省略发邮件的逻辑
        System.out.println("email-------------->" + message);
    }
}

消费者 – 短信服务

package com.xuexiangban.rabbitmq.springbootrabbitmqfanoutconsumer.consumer;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component;
// bindings其实就是用来确定队列和交换机绑定关系
@RabbitListener(bindings =@QueueBinding(
        // email.fanout.queue 是队列名字,这个名字你可以自定随便定义。
        value = @Queue(value = "sms.fanout.queue",autoDelete = "false"),
        // order.fanout 交换机的名字 必须和生产者保持一致
        exchange = @Exchange(value = "fanout_order_exchange",
                // 这里是确定的rabbitmq模式是:fanout 是以广播模式 、 发布订阅模式
                type = ExchangeTypes.FANOUT)
))
@Component
public class SMSService {
    // @RabbitHandler 代表此方法是一个消息接收的方法。该不要有返回值
    @RabbitHandler
    public void messagerevice(String message){
        // 此处省略发邮件的逻辑
        System.out.println("sms-------------->" + message);
    }
}

消费者 – 微信服务

package com.xuexiangban.rabbitmq.springbootrabbitmqfanoutconsumer.consumer;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component;
// bindings其实就是用来确定队列和交换机绑定关系
@RabbitListener(bindings =@QueueBinding(
        // email.fanout.queue 是队列名字,这个名字你可以自定随便定义。
        value = @Queue(value = "weixin.fanout.queue",autoDelete = "false"),
        // order.fanout 交换机的名字 必须和生产者保持一致
        exchange = @Exchange(value = "fanout_order_exchange",
                // 这里是确定的rabbitmq模式是:fanout 是以广播模式 、 发布订阅模式
                type = ExchangeTypes.FANOUT)
))
@Component
public class WeixinService {
    // @RabbitHandler 代表此方法是一个消息接收的方法。该不要有返回值
    @RabbitHandler
    public void messagerevice(String message){
        // 此处省略发邮件的逻辑
        System.out.println("weixin-------------->" + message);
    }
}

启动服务SpringbootRabbitmqFanoutConsumerApplication,查看效果

140_SpringBoot案例-fanout发布订阅模式

Original: https://www.cnblogs.com/wl3pb/p/16577897.html
Author: 清风(学习-踏实)
Title: 140_SpringBoot案例-fanout发布订阅模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581235/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 机器学习(2)文本特征抽取

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/cgy1995/p/9974732.htmlAuthor…

    Java 2023年6月8日
    083
  • 程序员副业之如何借国庆流量,用换头像小程序日赚500?

    你好啊,这里是程序员田同学。 再有二十天就是国庆了,时间快的让人猝不及防……除了缅怀以外,我们还要抓住商机。 今天就教你如何借国庆的流量,搭建国庆换头像小程…

    Java 2023年6月8日
    090
  • 介绍几个好用的工具类

    The end is also the new beginning 最近真的是忙的飞起啊!!年前还得更新一个版本,啊难受啊…趁今天有空,上来冒个泡😆 好,入正题,今天介…

    Java 2023年6月13日
    091
  • Java基础—双层for循环之小星星实操

    在Java基础中,我们会学到循环结构,其中for的双层循环更为常见。比如熟知的9*9乘法表就是用 双层for循环。 双层for循环的特点:1、内层循环一遍,相当于外层循环只执行一次…

    Java 2023年6月7日
    0106
  • java 删除字符串首尾指定字符

    package com.sankuai.dolphin.common.util; public class StringTrimUtils { /** * 删&#x9…

    Java 2023年5月29日
    0112
  • 8.Hystrix隔离术

    Hystrix隔离之ThreadPoolKey Hystrix可以不填写ThreadPoolKey 默认Hystrix会使用GroupKey命名线程池 在Setting中加入and…

    Java 2023年6月8日
    0109
  • JSP学习笔记

    jsp的全称是java server pages。其主要作用是代替Servlet程序回传html页面的数据。 JSP的本质 JSP页面本质是一个Servlet程序。当我们第一次访问…

    Java 2023年6月8日
    081
  • Nginx作为缓存服务

    一、缓存类型 1、服务端缓存 2、代理缓存 3、客户端缓存 4、代理缓存的工作流程: 二、代理缓存配置语法 1、代理缓存路径 配置语法 Syntax: proxy_cache_pa…

    Java 2023年5月30日
    097
  • 线程知识总结2

    参考文档:https://blog.csdn.net/weixin_45860338/article/details/113824249 B站:遇见狂神说 案例:线程停止 /** …

    Java 2023年6月7日
    094
  • Vim编辑器以及linux常用命令

    Shift+G tar -xvf *.tar firewall-cmd –list-ports firewall-cmd –reload systemctl…

    Java 2023年6月8日
    077
  • centos安装MySQL问题

    使用sudo yum install mysql-server出现没有可用软件包 mysql-server。 先 执行 wget http://repo.mysql.com/mys…

    Java 2023年6月7日
    094
  • java 学习资料集合

    原始数据类型与字长 见附件文档。 流程控制语句 异常体系 类/接口/枚举 线程体系结构 文件/流体系结构/NIO 正则表达式 GC原理 JDBC/SQL注入 Java安全类库/安全…

    Java 2023年5月29日
    088
  • 访问Github速度很慢以及解决方法(系统通用)

    原因分析1,CDN,Content Distribute Network,可以直译成内容分发网络,CDN解决的是如何将数据快速可靠从源站传递到用户的问题。用户获取数据时,不需要直接…

    Java 2023年6月14日
    099
  • IOC常用的创建对象方式

    1、User.java public class User { private String name; public User() { System.out.println(&q…

    Java 2023年6月15日
    067
  • 【转】【数学】矩阵的旋转

    1.简介 计算机图形学中的应用非常广泛的变换是一种称为仿射变换的特殊变换,在仿射变换中的基本变换包括平移、旋转、缩放、剪切这几种。本文以及接下来的几篇文章重点介绍一下关于旋转的变换…

    Java 2023年5月29日
    090
  • 使用yml多环境配置和创建多环境profile打包 springboot俩个@@ active: @profileActive@

    1、yml多环境配置在Spring Boot中多环境配置文件名需要满足application-{profile}.yml的格式,其中{profile}对应你的环境标识; appli…

    Java 2023年5月30日
    094
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球