RabbitMq使用

简介: RabbitMq使用

RabbitMq

rabbitMq初使用

RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。AMQP :Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。

优点:

不限语言

有管理界面

支持多种协议

可靠

理解rabbit的基本概念

  1. 交换机 excange 用来把数据路由到队列
  2. 队列 queue 存储消息
  3. 绑定 binding 将队列和交换机绑定
  4. 消息 message

交换机类型

  • fanout 不处理路由键,你只需要简单的将队列绑定到exchange上, routigngKey不需要
  • direct 根据键完全匹配 的单播模式
  • topic 可以使用* 和 #模糊匹配
  • 路由器跟据key进行匹配, 将消息发到匹配到的queue里面
  • header

消息发送到交换机,交换机跟据routingKey属性 将消息发到 对应的队列

springboot 集成 rabbitMq

1.加入依赖

 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2.application.yml

spring:
  application:
    name: Springboot-mq-demo
  rabbitmq:
    host: 192.168.10.10
    port: 5672 #default
    username: user
    password: pass

3.javaConfig配置

package com.bliu.qmqp.demo.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 RabbitConfig {
    @Bean
    public Queue queueA(){
        return new Queue("fanout.A");
    }
    @Bean
    public Queue queueB(){
        return new Queue("fanout.B");
    }
    /**
    *fanout交换机
    */
    @Bean
    FanoutExchange fanoutExchange(){
        return new FanoutExchange("fanoutExchange");
    }
    /**
    *绑定queue
    */
    @Bean
    Binding bindingExchangeA(Queue queueA, FanoutExchange fanoutExchange){
        return BindingBuilder.bind(queueA).to(fanoutExchange);
    }
    @Bean
    Binding bindingExchangeB(Queue queueB, FanoutExchange fanoutExchange){
        return BindingBuilder.bind(queueB).to(fanoutExchange);
    }
    //另一种方式
//    @Bean
//    public Declarables fanoutBindings() {
//        Queue fanoutQueue1 = new Queue("fanout.queue1", false);
//        Queue fanoutQueue2 = new Queue("fanout.queue2", false);
//        FanoutExchange fanoutExchange = new FanoutExchange("fanout.exchange");
//
//        return new Declarables(
//                fanoutQueue1,
//                fanoutQueue2,
//                fanoutExchange,
//                bind(fanoutQueue1).to(fanoutExchange),
//                BindingBuilder.bind(fanoutQueue2).to(fanoutExchange));
//    }
}

如你所见 fanout类型的exchange 只需要使用Binding 和 queue 绑在一起即可

return BindingBuilder.bind(queueA).to(fanoutExchange);

4.sender 和 receiver

package com.bliu.qmqp.demo.fanout;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class FanoutSender {
    //spring 帮我们封装的发送工具
    @Autowired
    private AmqpTemplate rabbitTemplate;
    /**
     * 将消息发送给 fanout 类型的exchange 路由键将会被忽略,并将消息传递到所有绑定的队列
     * When we send a message to a fanout exchange,
     * the routing key is ignored, and the message is passed to all bound queues.
     */
    public void send(){
        //params: [ exchange, routingKey, message ]
        rabbitTemplate.convertAndSend("fanoutExchange","", "hello rabbitMq!");
    }
}
package com.bliu.qmqp.demo.fanout;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.annotation.RabbitListeners;
import org.springframework.stereotype.Component;
@Component
@RabbitListeners({
        @RabbitListener(queues = "fanout.A"),
        @RabbitListener(queues = "fanout.B")
})//可以写一个@RabbitListener
public class FanoutReceiverA {
    //处理接收到的消息
    @RabbitHandler
    public void process(String message){
        System.out.println("fanout ReceiveA re: "+ message);
    }
}
  1. convertAndSend
    转换并发送消息
    更多

5.测试

    package com.bliu.qmqp.demo;
    import com.bliu.qmqp.demo.fanout.FanoutSender;
    import com.bliu.qmqp.demo.topic.TopicSender;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import java.util.Timer;
    import java.util.TimerTask;
    @SpringBootTest
    class DemoApplicationTests {
        @Autowired
        private FanoutSender fanoutSender;
        @Test
        void contextLoads() {
            fanoutSender.send();
        }
    }

参考连接:

https://www.baeldung.com/rabbitmq-spring-amqp

https://blog.csdn.net/qq_35387940/article/details/100514134

相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
存储 数据采集 数据可视化
【python】当当书籍数据抓取分析与可视化(代码+报告)【独一无二】
【python】当当书籍数据抓取分析与可视化(代码+报告)【独一无二】
|
分布式计算 Java Hadoop
Scala入门必刷的100道练习题(附答案)
Scala入门必刷的100道练习题(附答案)
1059 1
|
XML SQL 安全
Struts2 漏洞集合
Struts2 漏洞集合
|
Java 关系型数据库 MySQL
jdk,eclipse及MySQL的安装
jdk,eclipse及MySQL的安装
|
11月前
|
供应链 数据挖掘 API
探秘淘宝商品SKU信息API接口
在电子商务中,SKU(库存量单位)用于区分商品的不同规格、颜色、尺寸等属性,是精细化管理的基础。本文深入探讨淘宝商品SKU信息API接口,介绍其功能特点、使用方法及应用场景,并提供Python代码示例。该API支持实时更新、多维度筛选,帮助开发者获取全面的SKU信息,优化库存管理、订单处理和销售数据分析,提升运营效率与市场竞争力。
903 1
|
机器学习/深度学习 人工智能 运维
智能化运维:AI在现代IT管理中的应用
【6月更文挑战第7天】本文探讨了人工智能(AI)如何革新传统的IT运维模式,通过智能化工具和策略,提高系统稳定性、效率和安全性。文章首先介绍了AI在运维领域的应用背景,随后详细讨论了几个关键的AI技术及其在运维中的实际应用案例,最后分析了面临的挑战和未来的发展趋势。
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第7天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统要求检查与准备、配置安装源、安装 SQL Server 2019、配置 SQL Server 以及数据库初始化(可选)。通过这些步骤,你可以成功安装并初步配置 SQL Server 2019,进行简单的数据库操作。
444 1
|
存储 消息中间件 运维
高可用架构和系统设计思想
本文从研发规范层面、应用服务层面、存储层面、产品层面、运维部署层面、异常应急层面这六大层面去剖析一个高可用的系统需要有哪些关键的设计和考虑
|
存储 Kubernetes 监控
在K8S中,ELK是如何实现及如何优化的ES?
在K8S中,ELK是如何实现及如何优化的ES?
|
关系型数据库 MySQL 数据库
实时计算 Flink版操作报错合集之在分配所需的最少资源时出现问题,该如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。