RabbitMQ基于AMQP协议。

AMQP:是一个高级抽象层消息通信协议,RabbitMQ是AMQP协议的实现

RabbitMQ使用:Exchange(交换机)根据routing-key(路由选择键)匹配相应的queue(队列)

Exchange有4中类型:

direct:exchange在和queue进行binding时会设置routingkey,进行消息发送时,只有设置相同的routingkey,交换机才会路由到相应的队列。

topic:和direct差不多,只是topic允许routingkey使用通配符'*','#'.来匹配到相应的queue

fanout:直接将消息路由到所有绑定的队列中

header:和以上三个都不一样,其路由的规则是根据header来判断,其中的header就是以下方法的arguments参数

参考:https://www.cnblogs.com/julyluo/p/6265775.html,https://www.jianshu.com/p/d5675b1c8112

Routing Key:在Consumer在binding exchange和queue时指定;在Producer在发送消息时指定。
demo:
引入jar包:
<!-- RabbitMQ --><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.0.0</version></dependency><dependency><groupId>org.springframework.amqp</groupId><artifactId>spring-rabbit</artifactId><version>2.0.0.RELEASE</version></dependency>

增加RabbitMQ配置

<!-- rabbitMQ配置 --><bean id="rabbitConnectionFactory"class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory"><constructor-arg value="172.16.1.15"/><property name="username" value="admin"/><property name="password" value="admin"/><property name="channelCacheSize" value="8"/><property name="port" value="5672"></property></bean><rabbit:admin connection-factory="rabbitConnectionFactory"/><!--邮件相关队列--><rabbit:queue name="test_email_queue" durable="true"/><!--短信相关队列--><rabbit:queue name="test_sms_queue" durable="true"/><!--将队列和交换器通过路由键绑定--><rabbit:direct-exchange name="TEST_MQ"xmlns="http://www.springframework.org/schema/rabbit"durable="true"><rabbit:bindings><rabbit:binding queue="test_email_queue" key="email" ></rabbit:binding><rabbit:binding queue="test_sms_queue" key="sms" ></rabbit:binding></rabbit:bindings></rabbit:direct-exchange><!-- 创建rabbitTemplate 消息模板类 --><bean id="rabbitTemplate" class="org.springframework.amqp.rabbit.core.RabbitTemplate"><constructor-arg ref="rabbitConnectionFactory"></constructor-arg></bean><rabbit:listener-container connection-factory="rabbitConnectionFactory"><rabbit:listener queues="test_email_queue" ref="processUserEmail"method="onMessage"/><rabbit:listener queues="test_sms_queue" ref="processUserSms"method="onMessage"/></rabbit:listener-container>

实现类:(生产者写入MQ)

package com.study.demo.service.impl;import com.study.demo.service.IUserReg;
import com.study.demo.service.busi.SaveUser;
import com.study.demo.vo.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;/*** * @Description: RabbitMQ实现的异步用户注册* @author leeSmall* @date 2018年9月18日**/
@Service
@Qualifier("async")
public class AsyncProcess implements IUserReg{private Logger logger = LoggerFactory.getLogger(AsyncProcess.class);@Autowiredprivate RabbitTemplate rabbitTemplate;@Autowiredprivate SaveUser saveUser;public boolean userRegister(User user) {try {saveUser.saveUser(user);rabbitTemplate.send("TEST_MQ","email",new Message(user.getEmail().getBytes(),new MessageProperties()));rabbitTemplate.send("TEST_MQ","sms",new Message(user.getEmail().getBytes(),new MessageProperties()));} catch (AmqpException e) {logger.error(e.toString());return  false;}return true;}
}

消费者(监听调用该方法)

package com.study.demo.service.mq;import com.study.demo.service.busi.SendEmail;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;/*** * @Description: RabbitMQ消息消费端监听邮件消息类* @author leeSmall* @date 2018年9月18日**/
@Component
public class ProcessUserEmail implements MessageListener {private Logger logger = LoggerFactory.getLogger(ProcessUserEmail.class);@Autowiredprivate SendEmail sendEmail;public void onMessage(Message message) {logger.info("accept message,ready process......");sendEmail.sendEmail(new String(message.getBody()));}
}

package com.study.demo.service.mq;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import com.study.demo.service.busi.SendSms;/*** * @Description: RabbitMQ消息消费端监听sms消息类* @author leeSmall* @date 2018年9月18日**/
@Component
public class ProcessUserSms implements MessageListener {private Logger logger = LoggerFactory.getLogger(ProcessUserSms.class);@Autowiredprivate SendSms sendSms;public void onMessage(Message message) {logger.info("accept message,ready process......");sendSms.sendSms(new String(message.getBody()));}
}

使用目的:解耦,加快上文响应时间

使用场景:下单时关于库存的扣减、邮件、短信、消息的推送等需要异步处理的地方

如何使用的:
 库存的扣减:
用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。如下图:
 
传统模式的缺点:假如库存系统无法访问,则订单减库存将失败,从而导致订单失败,订单系统与库存系统耦合
应用消息队列后的方案:
 
订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功
库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作
假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦
 
 
 
邮件、短信的发送:
串行方式:

 

并行方式(异步):
消息队列方式(解耦):

转载于:https://www.cnblogs.com/wzk-0000/p/9809999.html

RabbitMQ使用简述相关推荐

  1. RabbitMQ-王磊-专题视频课程

    RabbitMQ-1078人已学习 课程介绍         rabbitmq使用场景,安装,vhost配置,简单队列,工作队列work queues,消息应答ack与消息持久化durable,pub ...

  2. 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程...

    简述C#中IO的应用 在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.IO ...

  3. RabbitMq消息序列化简述

    涉及网络传输的应用.序列化不可避免. 发送端以某种规则将消息转成byte数组进行发送. 接收端则以约定的规则进行byte[]数组的解析. 序列化的选择能够是jdk序列化,hessian,jackson ...

  4. RabbitMQ管理界面简述_入门试炼_第3篇

  5. 消息中间件选型分析 —— 从 Kafka 与 RabbitMQ 的对比来看全局

    一.前言 二.各类消息队列简述 三.选型要点概述 四.消息中间件选型误区探讨 一.前言 消息队列中间件(简称消息中间件)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布 ...

  6. 获取rabbitmq连接对象_RabbitMQ——简单队列

    RabbitMQ 简述# RabbitMQ是一个消息代理:它接受并转发消息. 您可以将其视为邮局:当您将要把寄发的邮件投递到邮箱中时,您可以确信Postman 先生最终会将邮件发送给收件人. 在这个比 ...

  7. 消息中间件选型分析——从Kafka与RabbitMQ的对比来看全局

    本文收录于InfoQ,未经允许不得转载. 欢迎跳转到本文原文:https://honeypps.com/mq/kafka-vs-rabbitmq/ 一.前言 消息队列中间件(简称消息中间件)是指利用高 ...

  8. 消息中间件(Kafka/RabbitMQ)收录集

    本篇主要整理工作中遇到的一些消息中间件的相关知识,包括Kafka, RabbitMQ, RocketMQ, ActiveMQ等,不排除收录其他消息中间件的可能. 这里会持续收录相关知识,包括安装.部署 ...

  9. 干趴面试官系列 | 请你简述一下Kafka中的分区分配

    欢迎跳转到本文的原文链接:https://honeypps.com/mq/kafka-basic-knowledge-of-partition-assignors/ "请你简述一下Kafka ...

最新文章

  1. python的assert作用
  2. 全家竟然都迷陕西卫视的《关东男人》
  3. html单击数字显示图片,记SpannableString金融数字显示与Html.from显示图片
  4. java实现md5加密示例
  5. mysql主备在同一台_MySQL高可用(一)主备同步:MySQL是如何保证主备一致的
  6. 371. 两整数之和
  7. Redis持久化的几种方式——RDB深入解析
  8. PyCharm中已经有requirements.txt没有提示自动安装
  9. linux openldap mysql_CentOS7安装OpenLDAP+MySQL+PHPLDAPadmin
  10. 计算机组成原理中ID是什么,计算机组成原理.doc
  11. Java_String
  12. Zabbix4.2邮件告警python脚本
  13. 怎么判断子元素距离父元素顶部位置_css子元素如何相对父元素定位?
  14. 大数据Hadoop之——数据仓库Hive
  15. Android5.1打开Emmagee显示错误
  16. 南佛罗里达大学计算机科学硕士,南佛罗里达大学计算机工程理学硕士研究生申请要求及申请材料要求清单...
  17. java.lang.UnsatisfiedLinkError解决方法汇集(转载)
  18. python深拷贝与浅拷贝
  19. 如何用科学的方法,保障数据准确性
  20. 三个月通过信息系统项目管理师经验帖(2021年11月,新鲜出炉,高项详解)

热门文章

  1. hdu2203 KMP水的问题
  2. 高斯滤镜模糊CSS3
  3. Dictionary帮助类
  4. (筆記) 如何在字串中從指定字元抓到指定字元(pointer版)?
  5. 鲁尼禁赛萨哈一射一传领风骚 曼联客场3-0查尔顿
  6. 简单的WINFORM窗体,体验WINFORM带来的快感
  7. Android使用Intent实现拨打电话的动作
  8. 《小马哥Spring Cloud系列》十五:分布式应用追踪-视频笔记
  9. haproxy 参数说明
  10. vim 实际行跟屏幕行移动命令