RabbiMQ基础以及spring-boot-starter-amqp使用
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使用相关推荐
- 自定义 Spring Boot Starter
一.引言 什么是Spring Boot Starter呢?我们直接来看看官网是怎么介绍的吧. Starters are a set of convenient dependency descripto ...
- Spring Boot Starter 常用列表
文章目录 1.美图 2.常用列表 3.源码中的starters 1.美图 2.常用列表 以下为常⽤用的 Spring Boot Starter 列列表. 名称 描述 Pom spring-boot-s ...
- 手把手教你定制标准 Spring Boot starter
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 写在前面 我们每次构建一个 Spring 应用程序时,我 ...
- 一个项目有两个pom_实现一个Spring Boot Starter超简单,读 Starter 源码也不在话下...
Spring Boot 对比 Spring MVC 最大的优点就是使用简单,约定大于配置.不会像之前用 Spring MVC 的时候,时不时被 xml 配置文件搞的晕头转向,冷不防还因为 xml 配置 ...
- 一个简易上手的短信服务Spring Boot Starter,连傻瓜都会!
作 者:jackieonway 来 源:jianshu.com/u/36510c75d37c 短信服务在用户注册.登录.找回密码等相关操作中,可以让用户使用更加便捷,越来越多的公司都采用短信验证的方式 ...
- 快速开发一个自定义 Spring Boot Starter ,希望你也会
来源:http://t.cn/Ai9li9fC 众所周知,Spring Boot由众多Starter组成,随着版本的推移Starter家族成员也与日俱增.在传统Maven项目中通常将一些层.组件拆分为 ...
- 自定义依赖注解无效_最详细的自定义Spring Boot Starter开发教程
1.前言 随着Spring的日渐臃肿,为了简化配置.开箱即用.快速集成,Spring Boot 横空出世.目前已经成为 Java 目前最火热的框架了.平常我们用Spring Boot开发web应用.S ...
- Spring boot starter
1:Spring boot starter及项目中的类似运用 1:Spring boot starter的两种方式 引入pom文件,自动管理jar版本 根据spring.factories配置文件,加 ...
- 《SpringCloud超级入门》Spring Boot Starter的介绍及使用《七》
目录 Spring Boot Starter项目创建 自动创建客户端 使用 Starter 使用注解开启 Starter 自动构建 使用配置开启 Starter 自动构建 配置 Starter 内容提 ...
- 实现一个 Spring Boot Starter 原来如此简单,读 Starter 源码也不在话下
我是风筝,公众号「古时的风筝」,一个在程序圈混迹多年,主业 Java,另外 Python.React 也玩儿的 6 的斜杠开发者.现已转行程序员鼓励师 Spring Cloud 系列文章已经完成,可以 ...
最新文章
- 物联网入门怎么学?物联网基础知识
- linux查看服务依赖关系,服务管理(1)
- JDK 1.5 新特性——自动拆箱装箱
- Linux内核--异常和中断的区别
- 【Android开发日记】第一个任务Android Service!Service靴+重力感应器+弹出窗口+保持执行...
- 离线地图显示连接服务器未打开,如何在uwp中使用OSM离线地图?没有可用的互联网连接时出现问题...
- Win10 注册IIs4.0的解决方案
- java 弹窗选择_如何在java中点击button弹出一个选择框
- can test 接收报文_获取CAN报文并解析
- html里面怎么引入swiper,JavaScript库——使用swiper.js创建嵌套的swiper
- 一种简单的加解密算法
- python循环读取文件越来越慢_python读取大文件越来越慢的原因与解决
- 快速实现python c扩展模块
- Share Disk、Share Memory和Share Nothing的区别
- 淘宝闲鱼等电商平台数据采集软件
- BZOJ2330【SCOI2011】糖果
- centos7下安装mysql5.7(rpm)
- 搭建文件服务器或nas免费版,nas文件服务器搭建
- 如何打开计算机用户账户控制面板,控制面板无法打开用户帐户
- 错误数据(图片)去除