RabbitMQ学习

参考:https://www.jianshu.com/p/6b62a0ed2491

消息队列:目前流行的有 Kafka、RabbitMQ、ActiveMQ等

功能:为了解决消息的分布式消费,完成项目、服务之间的解耦动作。消息的生产者与消费者之间完全采用异步通信方式,极大的提高了系统的响应能力,从而提高系统的网络请求吞吐量。

Spring-Boot 整合RabbitMQ

依赖:

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

RabbitMQ:跨平台的分布式消息队列服务,可以部署在任意的操作系统上。需要Erlang环境的支持,需要安装Erlang 和 RabbitMQ

RabbitMQ中有三种常用的转发方式:

1.DirectExchange:路由键方式转发消息

2.FanoutExchange:广播方式转发消息

3.TopicExchange: 主题匹配方式转发消息

DirectExchange:消息被生产者发送至RabbitMQ会携带一个路由键Key,RabbitMQ会将该消息转发,只有路由键为Key的队列消费者会完成消息的消费过程。

几个重要的类:

RabbitTemplate.ConfirmCallback:用来回调消息发送成功后的方法,当一个消息被成功写入RabbitMQ服务端时,就会自动回调RabbitTemplate.ConfirmCallback接口内的confirm方法完成通知。

两个配置信息:

队列的交换信息 ExchangeEnum

@Getter
public enum ExchangeEnum {

USER_REGISTER("user.register.topic.exchange");

private
String value;

ExchangeEnum(String value){
        this.value = value;
    }
}

队列路由信息 QueueEnum

@Getter
public enum QueueEnum {     /**
     *
用户注册枚举
    
*/
   
USER_REGISTER("user.register.queue","user.register");     /**
     *
队列名称
    
*/
   
private String name;     /**
     *
队列路由键
    
*/
   
private String routingKey;     QueueEnum(String name,String routingKey){
        this.name = name;
        this.routingKey = routingKey;
    }
}

用户注册消息队列配置

@Configuration
public class UserRegisterQueueConfiguration {     /**
     *
配置路由交换对象实例
    
*/
   
@Bean
    public DirectExchange userRegisterDirectExchange(){
        return new DirectExchange(ExchangeEnum.USER_REGISTER.getValue());
    }     /**
     *
配置用户注册队列对象实例
    
* 并设置持久化队列
    
*/
   
@Bean
    public Queue userRegisterQueue(){
        return new Queue(QueueEnum.USER_REGISTER.getName(),true);
    }     /**
     *
将用户注册队列绑定到路由交换配置上并设置指定路由键进行转发
     
*
     */
   
@Bean
    public Binding userRegisterBinding(){
        return BindingBuilder
               
.bind(userRegisterQueue()).to(userRegisterDirectExchange()).with(QueueEnum.USER_REGISTER.getRoutingKey());
    } }

配置交换实例:

DirectExchange实例对象,为交换设置名称,消息提供者与消息消费者的交换名称必须一致才可以通讯。

配置队列实例:

Queue实例对象,为消息队列设置名称,生产者与消费者的队列名称也必须一致。

绑定队列实例到交换实例中:

Binding实例对象,将Queue绑定到Exchange上,并通过设置的路由key进行消息转发。配置了路由key后,只有符合该路由的配置的消息才会被妆发到绑定的交换上的消息队列。

生产者:

在业务逻辑完成之后,调用消息发送方法,将消息发送至队列中

消费者:

@Component
@RabbitListener(queues = "user.register.queue")
public class UserRegisterMQ {     @RabbitHandler
    public void execute(UserEntity message){
        log.error("用户:"+message.toString()+",注册成功");
    }
}

两个注解:

@RabbitListener:队列消息监听注解,该注解配置监听queue内的队列名称列表。

@RabbitHandler 消息处理方法,该方法的参数需要与生产者发送消息的类型保持一致,否则无法自动调用消费方法,且无法完成消费。

本文临摹(抄袭)我的偶像 简书:恒宇少年 Spring-Boot 四十一章。

生产者和消费者是两个不同的项目,关于RabbitMQ的配置信息一模一样,两个项目分别启动,消息可以成功接收。

问题:我将消费者打包发给同事,同事无法启动,我们在同一局域网,但是他本地没有安装RabbitMQ,该问题后续定位。。。。。。。。。

RabbitMQ之路由键转发消息的更多相关文章

  1. SpringCloud Stream生产者配置RabbitMq的动态路由键

    在写这个文章前不得不吐槽目前国内一些blog的文章,尽是些复制粘贴的文章,提到点上但没任何的深入和例子.......... 经过测试下来总结一下RabbitMQ的Exchange的特性: 1.dire ...

  2. python中RabbitMQ的使用(路由键)

    1.简介 当我们希望每个接收端接收各自希望的消息时,我们可以使用路由键,此时交换机的类型为direct. 2.工作原理 每个接收端的消息队列在绑定交换机的时候,可以设定相应的路由键. 发送端通过交换机 ...

  3. 消息中间件系列三:使用RabbitMq原生Java客户端进行消息通信(消费者(接收方)自动确认模式、消费者(接收方)自行确认模式、生产者(发送方)确认模式)

    准备工作: 1)安装RabbitMQ,参考文章:消息中间件系列二:RabbitMQ入门(基本概念.RabbitMQ的安装和运行) 2.)分别新建名为OriginalRabbitMQProducer和O ...

  4. SpringCloud(六) - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)

    1.安装erlang语言环境 1.1 创建 erlang安装目录 mkdir erlang 1.2 上传解压压缩包 上传到: /root/ 解压缩# tar -zxvf otp_src_22.0.ta ...

  5. RabbitMQ入门-路由-有选择的接受消息

    比如一个日志系统,之前的处理方式呢,是各种类型(info,error,warning)的消息都发给订阅者,可是实际情况上不一定都需要.可能A需要error,其他的都不需要.那么就引入了今天的处理方式- ...

  6. RabbitMQ 入门系列:3、基础含义:持久化、排它性、自动删除、强制性、路由键。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  7. python中RabbitMQ的使用(路由键模糊匹配)

    路由键模糊匹配 使用正则表达式进行匹配.其中“#”表示所有.全部的意思:“*”只匹配到一个词. 匹配规则: 路由键:routings = [ 'happy.work',  'happy.life' , ...

  8. springboot rabbitmq direct exchange和topic exchange 写法上关于路由键的区别

    这是direct exchange写法中消息发送写法,可见下图红色框中路由键是queue队列中定义的路由键 这是topic exchange写法中消息发送写法,可见下图红色框中路由键是exchange ...

  9. RabbitMQ学习笔记2-理解消息通信

    消息包含两部分:1.有效载荷(payload) - 你想要传输的数据.2.标签(lable) - 描述有效载荷的相关信息,包含具体的交换器.消息的接受兴趣方等. rabbitmq的基础流程如下: Ra ...

随机推荐

  1. 14、Spark的核心术语

    Application:spark应用程序,就是用户基于spark api开发的程序,一定是通过一个有main方法的类执行的,比如java开发spark,就是在eclipse中,建立的一个工程 App ...

  2. iOS:如何实现在文字上添加拼音

    一.介绍 最近项目有一个需求,需要给朗诵的文字添加对应的拼音,而且要求使用原生的控件实现.一开始听到这个需求挺懵逼的,感觉有点难.后来,静下来想一下,其实还是可以实现的,无非就是自定义了.下面,就来说 ...

  3. 遭遇ASP.NET的Request is not available in this context

    如果ASP.NET程序以IIS集成模式运行,在Global.asax的Application_Start()中,只要访问Context.Request,比如下面的代码 var request = Co ...

  4. [C#] VS2017中在某些目录下使用不了 .NET Core 2.0 问题的处理办法

    作者: zyl910 一.缘由 最近遇到了一个奇怪的问题--明明已经在VS2017里装好了 .NET Core 2.0 SDK,且测试过新建一个 .NET Core 2.0控制台项目能成功使用.但是在 ...

  5. VS插件File Nesting

    开发者们一直以来都是使用Visual Studio的解决方案管理器 中的嵌套功能管理项目的子文件夹,使得文件组织清晰.便于访问.鉴于现在的项目巨大的文件数目,如果能将这种嵌入能力应用于项目的其他子项上 ...

  6. Pinterest凭什么拥有那么多用户:机器学习是答案

    目前,Pinterest月平均活跃用户量达到1亿,这家以图片为主的公司是如何留住用户并盈利的呢?Pinterest的主要目标是向用户推荐相关的图片或内容,推荐的内容足够精确才能提高用户黏性.近期,&l ...

  7. utf-8 编码问题

    使用下面直接进行处理$str = preg_replace('/[\x{10000}-\x{10FFFF}]/u', '', $str);

  8. 《Java 9 揭秘》全目录汇总

    Tips 做一个终身学习的人. 当写这篇文章时,关于Java 9的学习就先告一段落了. 首先介绍一下背景,大概两个月前,我突然有兴趣想看看Java 9,当时读了一本英文原著<Java 9 Rev ...

  9. Java中的Cloneable接口理解

    Cloneable接口是一个标记接口,也就是没有任何内容,定义如下: 这里分析一下这个接口的用法,clone方法是在Object种定义的,而且是protected型的,只有实现了这个接口,才可以在该类 ...

  10. 物联网架构成长之路(26)-Docker构建项目用到的镜像2

    0. 前言 前面介绍的都是一些标准的第三方中间件,基本都是有现成的Dockerfile或者Image,不需要我过多的关心,这一篇要介绍一些自己构建的Docker Image了.刚开始学,Dockerf ...