SpringBoot系列:RabbitMq讲解与示例

spring-boot-starter-test

test

org.springframework.boot

spring-boot-maven-plugin

true

其中在common包下,是swagger的配置文件。

package com.yanger.rabbitmq.common;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import springfox.documentation.builders.ApiInfoBuilder;

import springfox.documentation.builders.PathSelectors;

import springfox.documentation.builders.RequestHandlerSelectors;

import springfox.documentation.service.ApiInfo;

import springfox.documentation.service.Contact;

import springfox.documentation.spi.DocumentationType;

import springfox.documentation.spring.web.plugins.Docket;

import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**

  • @description Swagger插件

  • @author 杨号

  • @date 2018年9月14日

*/

@Configuration

@EnableSwagger2

public class SwaggerConfig {

@Bean

public Docket createRestApi() {

return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()

// 当前包路径

.apis(RequestHandlerSelectors.basePackage(“com.yanger”))

.paths(PathSelectors.any()).build();

}

private ApiInfo apiInfo() {

return new ApiInfoBuilder()

// 页面标题

.title(“yblog Swagger2 API接口”).description(“yblog API接口文档”)

.termsOfServiceUrl(“https://github.com/imyanger”)

// 创建人

.contact(new Contact(“yanger”, “https://github.com/imyanger/”, “550799932@qq.com”)).version(“1.0”)

.build();

}

}

这样我们的SpringBoot + RabbitMq环境就已经搭建完毕了,下面我们来具体探讨4中交换机策略。

1.Direct Exchange

Direct Exchange是RabbitMQ默认的交换机模式,也是最简单的模式,根据key全文匹配去寻找队列。

定义队列及路由匹配规则,分别为direct_queue_1和direct_queue_2

定义消费者,也就是消息接收者,我们这里发送者和接收在一个项目中,而实际生产中,可能不在一个项目中,但是效果都是一样的。@RabbitListener声明监听,并设置queues属性表明监听的队列。

然后是生产者,也就是消息发送者,这里发送消息的路由和队列的规则完全匹配,也为direct_queue_1和direct_queue_2

最后是测试类,我们创建了Controller进行接口调用,项目启动后,因为是get请求,可以浏览器地址栏调用,也可以使用swagger工具。

然后启动项目,在http://localhost:19031/swagger-ui.html下,我们已经可以看到该接口了。输入参数进行测试,后面的测试也是相同,将不在累述。

我们可以看到控制台的输出,和direct交换机策略介绍的一样,direct_queue_1接收接受了指向direct_queue_1路由的的消息,direct_queue_2接收接受了指向direct_queue_2路由的的消息。

2.Topic Exchange

按规则转发消息(最灵活) 转发消息主要是根据通配符。 在这种交换机下,队列和交换机的绑定会定义一种路由模式,那么,通配符就要在这种路由模式和路由键之间匹配后交换机才能转发消息。

路由键必须是一串字符,用句号(.) 隔开,路由模式必须包含一个 星号(*),主要用于匹配路由键指定位置的一个单词, 井号(#)就表示相当于一个或者多个单词。

下面是配置文件,队列1.2.3绑定了topic交换机,且路由规则分别定义为routingkey.#、#.topic和#。

package com.yanger.rabbitmq.topic;

import org.springframework.amqp.core.Binding;

import org.springframework.amqp.core.BindingBuilder;

import org.springframework.amqp.core.Queue;

import org.springframework.amqp.core.TopicExchange;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class TopicConfig {

/*

按规则转发消息(最灵活) 转发消息主要是根据通配符。 在这种交换机下,队列和交换机的绑定会定义一种路由模式,那么,通配符就要在这种路由模式和路由键之间匹配后交换机才能转发消息。

路由键必须是一串字符,用句号(.) 隔开,

路由模式必须包含一个 星号(*),主要用于匹配路由键指定位置的一个单词, 井号(#)就表示相当于一个或者多个单词

*/

public static final String QUEUE1 = “topic_queue_1”;

public static final String QUEUE2 = “topic_queue_2”;

public static final String QUEUE3 = “topic_queue_3”;

@Bean

public Queue topicQueue1() {

return new Queue(QUEUE1);

}

@Bean

public Queue topicQueue2() {

return new Queue(QUEUE2);

}

@Bean

public Queue topicQueue3() {

return new Queue(QUEUE3);

}

// topic策略的交换机

@Bean

public TopicExchange topicExchange(){

return new TopicExchange(“topic”);

}

// 绑定topicQueue1到topic交换机上,并指定路由匹配规则为routingkey.#,即路由以routingkey.开头的消息都将被topicQueue1接收

@Bean

public Binding topicBinding1(){

return BindingBuilder.bind(topicQueue1()).to(topicExchange()).with(“routingkey.#”);

}

// 绑定topicQueue2到topic交换机上,并指定路由匹配规则为#.topic,即路由以.topic结尾的消息都将被topicQueue2接收

@Bean

public Binding topicBinding2(){

return BindingBuilder.bind(topicQueue2()).to(topicExchange()).with(“#.topic”);

}

// 绑定topicQueue3到topic交换机上,并指定路由匹配规则为路由#,即任意路由消息都将被topicQueue3接收

@Bean

public Binding topicBinding3(){

return BindingBuilder.bind(topicQueue3()).to(topicExchange()).with(“#”);

}

}

下面是消费者,主要是对规则及接收的消息进行打印输出。

生产者,向topic交换机上路由routingkey.all、all.topic、all.all发送消息。

进行测试,最终结果,可以发现绑定#规则的队列接收了该交换机上所有路由的消息,routingkey.#则接收该交换机上routingkey.开头的,#.topic则接收所有.topic结尾的。可以将all换成一个或多个字符,测试结果是一样的。

3. Headers Exchange

设置header attribute参数类型的交换机,相较于 direct 和 topic 固定地使用 routing_key , headers 则是一个自定义匹配规则的类型. 在队列与交换器绑定时, 会设定一组键值对规则, 消息中也包括一组键值对( headers 属性), 当这些键值对有一对, 或全部匹配时, 消息被投送到对应队列。

header策略配置文件,将headers_queue_1和headers_queue_2分别绑定到headers交换机上,并指定匹配规则,whereAll要求header中属性全部都匹配,而whereAny允许有任意一个属性匹配即可。

package com.yanger.rabbitmq.headers;

import java.util.HashMap;

import java.util.Map;

import org.springframework.amqp.core.Binding;

import org.springframework.amqp.core.BindingBuilder;

import org.springframework.amqp.core.HeadersExchange;

import org.springframework.amqp.core.Queue;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class HeadersConfig {

/**

headers是一个自定义匹配规则的类型,在队列与交换器绑定时,会设定一组键值对规则,

消息中也包括一组键值对( headers 属性), 当这些键值对有一对, 或全部匹配时, 消息被投送到对应队列

*/

public static final String QUEUE1 = “headers_queue_1”;

public static final String QUEUE2 = “headers_queue_2”;

@Bean

public Queue headersQueue1() {

return new Queue(QUEUE1);

}

@Bean

public Queue headersQueue2() {

return new Queue(QUEUE2);

}

// headers策略的交换机

@Bean

public HeadersExchange headersExchange(){

return new HeadersExchange(“headers”);

}

// 绑定headersQueue1到headers交换机上,并指定当type和key全匹配

@Bean

public Binding headersBinding1(){

Map<String, Object> allMap = new HashMap<>();

allMap.put(“type”, “headers”);

allMap.put(“key”, “1234”);

return BindingBuilder.bind(headersQueue1()).to(headersExchange()).whereAll(allMap).match();

}

// 绑定headersQueue2到headers交换机上,并指定当type和key任意匹配一个

@Bean

public Binding headersBinding2(){

Map<String, Object> allMap = new HashMap<>();

allMap.put(“type”, “headers”);

allMap.put(“key”, “1234”);

return BindingBuilder.bind(headersQueue2()).to(headersExchange()).whereAny(allMap).match();

}

}

消息费,依旧输出接收的消息。

生产者,分别headers属性全匹配、headers属性type匹配、headers属性key匹配。

进行测试,结果如下。全匹配的只能接收headers属性全匹配的消息,而任意匹配的则最低只需要满足header属性中任意一个即可,当然满足多个也能接收,所以同样也接收到了全匹配发出的消息。

4. Fanout Exchange

转发消息到所有绑定队列,消息广播的模式,不管路由键或者是路由模式,会把消息发给绑定给它的全部队列,如果配置了routing_key会被忽略。

配置文件,fanou策略的交换机,只需要绑定队列到fanout交换机上,不需要指定路由规则。

package com.yanger.rabbitmq.fanout;

import org.springframework.amqp.core.Binding;

import org.springframework.amqp.core.BindingBuilder;

import org.springframework.amqp.core.FanoutExchange;

import org.springframework.amqp.core.Queue;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class FanoutConfig {

/*

转发消息到所有绑定队列,消息广播的模式,不管路由键或者是路由模式,

会把消息发给绑定给它的全部队列,如果配置了routing_key会被忽略。

*/

public static final String QUEUE1 = “fanout_queue_1”;

public static final String QUEUE2 = “fanout_queue_2”;

@Bean

public Queue fanoutQueue1() {

return new Queue(QUEUE1);

}

@Bean

public Queue fanoutQueue2() {

return new Queue(QUEUE2);

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。

如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。

如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。

[外链图片转存中…(img-I1BaYCT6-1713413786992)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值