与 Spring 集成

pom 文件

  使用 Maven,这里使用的 4.3.11,所以这里引入的是 rabbit 是 2.0.0,如果兼容性的话请自行去 Spring 的官网上去查

这里补充一下,spring 的引入也是对原生进行包装

统一配置

配置文件中增加命名空间

连接相关配置:

  客户端连接

  管理配置

生产者端(基础配置)

  RabbitTemplate

或下面这种声明方式也是可以的。

队列和交换器

可以在生产者配置文件中增加队列和交换器

发送消息时,使用 rabbitTemplate即可。同时还可以给消息配置属性 MessageProperties。

这里重申一下,生产者和消费都可以申明交换器、申明队列、绑定关系,一般处理是生产者和消费者都相同配置,这样以防止万一,如果生产者或者消费者单独启动,发送或者消费数据不会出现问题。

消费者端(基础配置)

队列和交换器、

  消费者中也可配置队列和交换器,以及指定队列和交换器绑定的路由键

消费者 bean

两种方式,一种配置文件,一种注解定义配置文件

注解定义

监听容器

将消费者 bean 和队列联系起来

代码

消费者实现 MessageListener接口即可。

生产者端(高级配置)

发送者确认的回调

  实现方式和原生差不多,如下图代码见 rq-order 包中的配置

失败通知的回调

实现方式和原生差不多

消费者端(高级配置)

手动确认

  实现方式和原生差不多

这里能够拿到信道 Channel 的话,具体操作就和原生一样。前面讲过的原生中的各种情况就可以根据你的业务场景来处理了。

Qos

与 SpringBoot 集成

pom 文件

这里 springboot 的版本我们使用 2.1.1,保持和我们一期讲解 Springboot 版本的一致性

这里 SpringBoot 也是对原生进行包装,同理与 Spring 中引入 RabbitMQ

统一配置

配置连接相关配置

  这里包括虚拟机、发送方确认我们都加上

连接工厂使用

一个配置类

RabbitTemplate

队列和交换器及绑定关系

  可以在生产者配置 RabbitConfig 类中增加队列和交换器

默认交换器(direct)

  默认情况下,申明一个队列,如果没有建立与交换器的绑定关系,系统默认分配一个 Default 交换器(多个队列也是这一个),默认匹配队列名称

Topic类型

Fanout类型

发送者失败通知

发送者确认的回调

生产者

默认情况下(direct交换器绑定的队列)

HelloReceiver、UserReceiver

Topic交换器(绑定的队列)

TopicEmailMessageReceiver、TopicUserMessageReceiver

Fanout交换器(绑定的队列)

FanoutReceiver

消费者

默认情况下(direct交换器绑定的队列)

  HelloReceiver、UserReceiver

Topic交换器(绑定的队列)

  TopicEmailMessageReceiver、TopicUserMessageReceiverFanout交换器(绑定的队列)

  FanoutReceiver

演示效果

普通类型(direct 交换)测试

  http://localhost:8080/rabbit/hello

生产者

消费者

简单消费者

消费者手动确认

广播类型(Fanout 交换)测试

http://localhost:8080/rabbit/fanoutTest

生产者

消费者

简单消费者

Topic 类型(topic 交换)测试

http://localhost:8080/rabbit/topicTest

实战-应用解耦

场景:

  用户下订单买商品,订单处理成功后,去扣减库存,在这个场景里,订单系统是生产者,库存系统是消费者。

  库存是必须扣减的,在业务上来说,有库存直接扣减即可,没库存或者低于某个阈值,可以扣减成功,不过要通知其他系统(如通知采购系统尽快采购,通知用户订单系统我们会尽快调货)。

RPC 实现

通过 RPC 的实现,可以看到 RPC 会造成耦合。一旦库存系统失败,订单系统也会跟着失败。我们希望库存系统本身的失败,不影响订单系统的继续执行,在业务流程上,进行订单系统和库存系统的解耦。

RabbitMQ 的实现

  对于我们消息模式的实现,为保证库存必须有扣减,我们要考虑几个问题:

  1、订单系统发给 Mq 服务器的扣减库存的消息必须要被 Mq 服务器接收到,意味着需要使用发送者确认。

  2、Mq 服务器在扣减库存的消息被库存服务正确处理前必须一直保存,那么需要消息进行持久化。

  3、某个库存服务器出了问题,扣减库存的消息要能够被其他正常的库存服务处理,需要我们自行对消费进行确认,意味着不能使用消费者自动确认,而应该使用手动确认。

  所以生产者订单系统这边需要 ,配置文件中队列和交换器进行持久化,消息发送时的持久化,发送者确认的相关配置和代码。

  所以消费者库存系统这边要进行手动确认。

rabbitmq集成和实战的更多相关文章

  1. C# RabbitMQ优先级队列实战项目演练

    一.需求背景 当用户在商城上进行下单支付,针对客户等级的不同和订单金额的大小划分客户级别,需要优先处理给标识为大订单的客户发送一份订单邮件提醒.那么我们应用程序如何解决这样的需求场景呢?今天阿笨给大家 ...

  2. Jenkins持续集成企业实战系列之Jenkins插件下载及邮件配置-----05

    注:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.    最初接触Jenkins也是由于公司需求,根据公司需求Java代码项目升级的.(公司是 ...

  3. Jenkins持续集成企业实战系列之Jenkins手动构建-----04

    注:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.    最初接触Jenkins也是由于公司需求,根据公司需求Java代码项目升级的.(公司是 ...

  4. Jenkins持续集成企业实战系列之Jenkins配置演示-----03

    注:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.    最初接触Jenkins也是由于公司需求,根据公司需求Java代码项目升级的.(公司是 ...

  5. Jenkins持续集成企业实战系列之Jenkins持续集成简介及安装-----02

    1.      Jenkins持续集成简介 注:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.    最初接触Jenkins也是由于公司需求, ...

  6. Jenkins持续集成企业实战系列之两种网站部署的流程-----01

    注:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.    最初接触Jenkins也是由于公司需求,根据公司需求Java代码项目升级的.(公司是 ...

  7. Jenkins持续集成企业实战

    阅读目录: Jenkins持续集成企业实战1.1 目前主流网站部署的流程1.2 Jenkins持续集成简介1.3 Jenkins持续集成组件1.4 Jenkins平台安装部署1.5 Jenkins相关 ...

  8. RabbitMQ 整合 SpringCloud实战

    RabbitMQ 整合 SpringCloud实战RabbitMQ 整合 SpringCloud实战rabbitmq-common 子项目rabbitmq-springcloud-consumer 子 ...

  9. Django集成celery实战小项目

    上一篇已经介绍了celery的基本知识,本篇以一个小项目为例,详细说明django框架如何集成celery进行开发. 本系列文章的开发环境: window 7 + python2.7 + pychar ...

随机推荐

  1. 微信公众号添加zip

    微信公众号添加zip的教程 我们都知道创建一个微信公众号,在公众号中发布一些文章是非常简单的,但公众号添加附件下载的功能却被限制,如今可以使用小程序“微附件”进行在公众号中添加附件. 以下是公众号添加 ...

  2. lombok的基本使用方法

    在java刚开始学习的时候,首先就会学习封装.继承和多态,就拿封装来说,封装就是为了保护数据安全而将实体类内部数据保持为私有状态,如果外部程序想要访问里面的数据就必须调用此实体类提供的相关数据接口,这 ...

  3. java目前常用的几种定时任务

    java目前常用的几种定时任务 JDK自带的Timer spring的Task Quartz elastic-job分布式定时任务 一.JDK自带的Timer Timer是jdk中提供的一个定时器工具 ...

  4. OpenCV之高斯平滑(Python实现)

    假设一个列数为W,行数为H的高斯卷计算子gaussKernel,其中W,H均为奇数,描点位置在((H-1)/2 ,(W-1)/2),构建高斯卷积核的步骤如下 1.计算高斯矩阵 \[gaussMatri ...

  5. java this关键字调用构造方法

    一 this调用构造方法 构造方法之间的调用,可以通过this关键字来完成. 格式: this(参数列表); 构造方法的调用举例: class Person { // Person的成员属性 priv ...

  6. Quartz.Net的基础使用方法,多任务执行继续扩展

    前一篇随笔讲了Quartz多任务的简单实现 Quartz.Net的基础使用方法,多任务执行 这一篇,来简单对前一篇进行一下简单的扩展 看了前一篇的代码会发现,每次新增一个任务还要去GetJobs方法里 ...

  7. ES6语法学习(一)-let和const

    1.let 和 const 变量提升: 在声明变量或者函数时,被声明的变量和函数会被提升到函数最顶部: 但是如果声明的变量或者函数被初始化了,则会失去变量提升: 示例代码: param2 = &quo ...

  8. vue 三元表达式当出现elif

    方式一: <span class="person_name">{{item.type_name == '车商' ? item.title : item.type_nam ...

  9. Newbe.Claptrap 框架如何实现在多种框架之上运行?

    Newbe.Claptrap 框架如何实现在多种框架之上运行?最近整理了一下项目的术语表.今天就谈谈什么是 Claptrap Box. 特别感谢 kotone 为本文提供的校对建议! Newbe.Cl ...

  10. 2020.5.25 第五篇 Scrum冲刺博客

    Team:银河超级无敌舰队 Project:招新通 项目冲刺集合贴:链接 目录 一.每日站立会议 1.1 会议照片 1.2 项目完成情况 二.项目燃尽图 三.签入记录 3.1 代码/文档签入记录 3. ...