​ RabbitMQ是一种基于amq协议的消息队列,本文主要记录一下rabbitmq的基础内容以及使用spring-boot-starter-amqp操作rabbitmq。

1,rabbitmq中的几个重要概念

a) 虚拟主机(vhost)

​ 虚拟主机:一个虚拟主机持有一组交换机、队列和绑定。虚拟主机的作用在于进行权限管控,rabbitmq默认有一个虚拟主机"/"。可以使用rabbitmqctl add_vhost命令添加虚拟主机,然后使用rabbitmqctl set_permissions命令设置指定用户在指定虚拟主机下的权限,以此达到权限管控的目的。

b) 消息通道(channel)

消息通道:  在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

c) 交换机(exchange)

​ 交换机: exchange的功能是用于消息分发,它负责接收消息并转发到与之绑定的队列,exchange不存储消息,如果一个exchange没有binding任何Queue,那么当它会丢弃生产者发送过来的消息,在启用ACK机制后,如果exchange找不到队列,则会返回错误。一个exchange可以和多个Queue进行绑定。

交换机有四种类型:

  • 路由模式(Direct):

    ​direct 类型的行为是"先匹配, 再投送"。即在绑定时设定一个 routing_key, 消息的routing_key 匹配时, 才会被交换器投送到绑定的队列中去。direct是rabbitmq的默认交换机类型。

  • 通配符模式(Topic):

    ​类似路由模式,但是routing_key支持模糊匹配,按规则转发消息(最灵活)。符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词。

  • 发布订阅模式(Fanout):

    ​转发消息到所有绑定队列,忽略routing_key。

  • Headers:

​ 设置header attribute参数类型的交换机。相较于 direct 和 topic 固定地使用 routing_key , headers 则是一个自定义匹配规则的类型,忽略routing_key。在队列与交换器绑定时, 会设定一组键值对规则, 消息中也包括一组键值对( headers 属性), 当这些键值对有一对, 或全部匹配时, 消息被投送到对应队列。
​ 在绑定Queue与Exchange时指定一组键值对,当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配。如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers属性是一个键值对,可以是Hashtable,键值对的值可以是任何类型。

匹配规则x-match有下列两种类型:

x-match = all :表示所有的键值对都匹配才能接受到消息
x-match = any :表示只要有键值对匹配就能接受到消息

2,使用spring-boot-starter-amqp操作rabbitmq

首先添加相关依赖:

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

application.properties中配置rabbitmq相关配置:

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=cord
spring.rabbitmq.password=123456
spring.rabbitmq.publisher-confirms=true
spring.rabbitmq.virtual-host=/

定义rabbitmq配置类:

RabbitMQConfig.java

@Configuration
public class RabbitMQConfig {private static final String topicExchangeName = "topic-exchange";private static final String fanoutExchange = "fanout-exchange";private static final String headersExchange = "headers-exchange";private static final String queueName = "cord";//声明队列@Beanpublic Queue queue() {//Queue(String name, boolean durable, boolean exclusive, boolean autoDelete)return new Queue("cord", false, true, true);}//声明Topic交换机@BeanTopicExchange topicExchange() {return new TopicExchange(topicExchangeName);}//将队列与Topic交换机进行绑定,并指定路由键@BeanBinding topicBinding(Queue queue, TopicExchange topicExchange) {return BindingBuilder.bind(queue).to(topicExchange).with("org.cord.#");}//声明fanout交换机@BeanFanoutExchange fanoutExchange() {return new FanoutExchange(fanoutExchange);}//将队列与fanout交换机进行绑定@BeanBinding fanoutBinding(Queue queue, FanoutExchange fanoutExchange) {return BindingBuilder.bind(queue).to(fanoutExchange);}//声明Headers交换机@BeanHeadersExchange headersExchange() {return new HeadersExchange(headersExchange);}//将队列与headers交换机进行绑定@BeanBinding headersBinding(Queue queue, HeadersExchange headersExchange) {Map<String, Object> map = new HashMap<>();map.put("First","A");map.put("Fourth","D");//whereAny表示部分匹配,whereAll表示全部匹配
//        return BindingBuilder.bind(queue).to(headersExchange).whereAll(map).match();return BindingBuilder.bind(queue).to(headersExchange).whereAny(map).match();}
}

定义生产者:

Producer.java

@Component
public class Producer {@Autowiredprivate AmqpTemplate template;@Autowiredprivate AmqpAdmin admin;/*** @param routingKey 路由关键字* @param msg 消息体*/public void sendDirectMsg(String routingKey, String msg) {template.convertAndSend(routingKey, msg);}/*** @param routingKey 路由关键字* @param msg 消息体* @param exchange 交换机*/public void sendExchangeMsg(String exchange, String routingKey, String msg) {template.convertAndSend(exchange, routingKey, msg);}/*** @param map 消息headers属性* @param exchange 交换机* @param msg 消息体*/public void sendHeadersMsg(String exchange, String msg, Map<String, Object> map) {template.convertAndSend(exchange, null, msg, message -> {message.getMessageProperties().getHeaders().putAll(map);return message;});}
}

定义消费者:

Consumer.class

@Component
public class Consumer {@RabbitListener(queues = "cord")//@RabbitListener(queues = "cord", containerFactory="myFactory")public void processMessage(String msg) {System.out.format("Receiving Message: -----[%s]----- \n.", msg);}
}

测试用例:

RabbitmqTest.java

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = CordApplication.class)
public class RabbitmqTest {@Autowiredprivate Producer producer;//Direct@Testpublic void sendDirectMsg() {producer.sendDirectMsg("cord", String.valueOf(System.currentTimeMillis()));}//Topic@Testpublic void sendtopicMsg() {producer.sendExchangeMsg("topic-exchange","org.cord.test", "hello world");}//Fanout@Testpublic void sendFanoutMsg() {producer.sendExchangeMsg("fanout-exchange", "abcdefg", String.valueOf(System.currentTimeMillis()));}//Headers@Testpublic void sendHeadersMsg() {Map<String, Object> map = new HashMap<>();map.put("First","A");producer.sendHeadersMsg("headers-exchange", "hello word", map);}
}

RabbiMQ基础以及spring-boot-starter-amqp使用相关推荐

  1. 自定义 Spring Boot Starter

    一.引言 什么是Spring Boot Starter呢?我们直接来看看官网是怎么介绍的吧. Starters are a set of convenient dependency descripto ...

  2. Spring Boot Starter 常用列表

    文章目录 1.美图 2.常用列表 3.源码中的starters 1.美图 2.常用列表 以下为常⽤用的 Spring Boot Starter 列列表. 名称 描述 Pom spring-boot-s ...

  3. 手把手教你定制标准 Spring Boot starter

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 写在前面 我们每次构建一个 Spring 应用程序时,我 ...

  4. 一个项目有两个pom_实现一个Spring Boot Starter超简单,读 Starter 源码也不在话下...

    Spring Boot 对比 Spring MVC 最大的优点就是使用简单,约定大于配置.不会像之前用 Spring MVC 的时候,时不时被 xml 配置文件搞的晕头转向,冷不防还因为 xml 配置 ...

  5. 一个简易上手的短信服务Spring Boot Starter,连傻瓜都会!

    作 者:jackieonway 来 源:jianshu.com/u/36510c75d37c 短信服务在用户注册.登录.找回密码等相关操作中,可以让用户使用更加便捷,越来越多的公司都采用短信验证的方式 ...

  6. 快速开发一个自定义 Spring Boot Starter ,希望你也会

    来源:http://t.cn/Ai9li9fC 众所周知,Spring Boot由众多Starter组成,随着版本的推移Starter家族成员也与日俱增.在传统Maven项目中通常将一些层.组件拆分为 ...

  7. 自定义依赖注解无效_最详细的自定义Spring Boot Starter开发教程

    1.前言 随着Spring的日渐臃肿,为了简化配置.开箱即用.快速集成,Spring Boot 横空出世.目前已经成为 Java 目前最火热的框架了.平常我们用Spring Boot开发web应用.S ...

  8. Spring boot starter

    1:Spring boot starter及项目中的类似运用 1:Spring boot starter的两种方式 引入pom文件,自动管理jar版本 根据spring.factories配置文件,加 ...

  9. 《SpringCloud超级入门》Spring Boot Starter的介绍及使用《七》

    目录 Spring Boot Starter项目创建 自动创建客户端 使用 Starter 使用注解开启 Starter 自动构建 使用配置开启 Starter 自动构建 配置 Starter 内容提 ...

  10. 实现一个 Spring Boot Starter 原来如此简单,读 Starter 源码也不在话下

    我是风筝,公众号「古时的风筝」,一个在程序圈混迹多年,主业 Java,另外 Python.React 也玩儿的 6 的斜杠开发者.现已转行程序员鼓励师 Spring Cloud 系列文章已经完成,可以 ...

最新文章

  1. 物联网入门怎么学?物联网基础知识
  2. linux查看服务依赖关系,服务管理(1)
  3. JDK 1.5 新特性——自动拆箱装箱
  4. Linux内核--异常和中断的区别
  5. 【Android开发日记】第一个任务Android Service!Service靴+重力感应器+弹出窗口+保持执行...
  6. 离线地图显示连接服务器未打开,如何在uwp中使用OSM离线地图?没有可用的互联网连接时出现问题...
  7. Win10 注册IIs4.0的解决方案
  8. java 弹窗选择_如何在java中点击button弹出一个选择框
  9. can test 接收报文_获取CAN报文并解析
  10. html里面怎么引入swiper,JavaScript库——使用swiper.js创建嵌套的swiper
  11. 一种简单的加解密算法
  12. python循环读取文件越来越慢_python读取大文件越来越慢的原因与解决
  13. 快速实现python c扩展模块
  14. Share Disk、Share Memory和Share Nothing的区别
  15. 淘宝闲鱼等电商平台数据采集软件
  16. BZOJ2330【SCOI2011】糖果
  17. centos7下安装mysql5.7(rpm)
  18. 搭建文件服务器或nas免费版,nas文件服务器搭建
  19. 如何打开计算机用户账户控制面板,控制面板无法打开用户帐户
  20. 错误数据(图片)去除

热门文章

  1. unef螺纹_PT螺纹,NPT螺纹,G螺纹,公制螺纹的区别
  2. HDU-3537 Mock Turtles型翻硬币游戏
  3. 并行算法第二讲:并行算法基础知识
  4. 实用技巧:快速定位Zuul的性能瓶颈
  5. BHIOT-833物联网智能网关
  6. Android 如何添加一个新的时区
  7. SQL 高效的万能分页存储过程
  8. 性能测试:基础(1)
  9. Selenium模拟JQuery滑动解锁
  10. oracle索引可以加到in,为什么你加的索引不管用?