SpringBoot整合RabbitMQ的5种模式实战


Posted in Java/Android onAugust 02, 2021

一、环境准备

SpringBoot整合RabbitMQ的5种模式实战

1、pom依赖

<!-- 父工程依赖 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.6.RELEASE</version>
    </parent>

    <dependencies>
        <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>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.6.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.6.0</version>
        </dependency>
    </dependencies>

2、配置文件

server:
  port: 8080

spring:
  rabbitmq:
    host: 192.168.131.171
    port: 5672
    username: jihu
    password: jihu
    virtual-host: /jihu

3、启动类

@SpringBootApplication
public class RabbitMQApplication {
   public static void main(String[] args) {
       SpringApplication.run(RabbitMQApplication.class);
   }
}

5、Swagger2类

@Configuration
@EnableSwagger2
public class Swagger2 {
    // http://127.0.0.1:8080/swagger-ui.html
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.jihu"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("极狐-Spring Boot中使用spring-boot-starter-amqp集成rabbitmq")
                .description("测试SpringBoot整合进行各种工作模式信息的发送")
/*
	                .termsOfServiceUrl("https://www.jianshu.com/p/c79f6a14f6c9")
*/
                .contact("roykingw")
                .version("1.0")
                .build();
    }
}

6、ProducerController

@RestController
public class ProducerController {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    //helloWorld 直连模式
    @ApiOperation(value = "helloWorld发送接口", notes = "直接发送到队列")
    @GetMapping(value = "/helloWorldSend")
    public Object helloWorldSend(String message) throws AmqpException, UnsupportedEncodingException {
        //设置部分请求参数
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN);

        //发消息
        rabbitTemplate.send("helloWorldqueue", new Message(message.getBytes("UTF-8"), messageProperties));
        return "message sended : " + message;
    }


    //工作队列模式
    @ApiOperation(value = "workqueue发送接口", notes = "发送到所有监听该队列的消费")
    @GetMapping(value = "/workqueueSend")
    public Object workqueueSend(String message) throws AmqpException, UnsupportedEncodingException {
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN);
        //制造多个消息进行发送操作
        for (int i = 0; i < 10; i++) {
            rabbitTemplate.send("work_sb_mq_q", new Message(message.getBytes("UTF-8"), messageProperties));
        }
        return "message sended : " + message;
    }


    // pub/sub 发布订阅模式   交换机类型 fanout
    @ApiOperation(value = "fanout发送接口", notes = "发送到fanoutExchange。消息将往该exchange下的所有queue转发")
    @GetMapping(value = "/fanoutSend")
    public Object fanoutSend(String message) throws AmqpException, UnsupportedEncodingException {
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN);
        //fanout模式只往exchange里发送消息。分发到exchange下的所有queue
        rabbitTemplate.send("fanoutExchange", "", new Message(message.getBytes("UTF-8"), messageProperties));
        return "message sended : " + message;
    }


    //routing路由工作模式  交换机类型 direct
    @ApiOperation(value = "direct发送接口", notes = "发送到directExchange。exchange转发消息时,会往routingKey匹配的queue发送")
    @GetMapping(value = "/directSend")
    public Object routingSend(String routingKey, String message) throws AmqpException, UnsupportedEncodingException {

        if (null == routingKey) {
            routingKey = "china.changsha";
        }
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN);
        //fanout模式只往exchange里发送消息。分发到exchange下的所有queue
        rabbitTemplate.send("directExchange", routingKey, new Message(message.getBytes("UTF-8"), messageProperties));
        return "message sended : routingKey >" + routingKey + ";message > " + message;
    }


    //topic 工作模式   交换机类型 topic
    @ApiOperation(value = "topic发送接口", notes = "发送到topicExchange。exchange转发消息时,会往routingKey匹配的queue发送,*代表一个单词,#代表0个或多个单词。")
    @GetMapping(value = "/topicSend")
    public Object topicSend(String routingKey, String message) throws AmqpException, UnsupportedEncodingException {

        if (null == routingKey) {
            routingKey = "changsha.kf";
        }
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN);
        //fanout模式只往exchange里发送消息。分发到exchange下的所有queue
        rabbitTemplate.send("topicExchange", routingKey, new Message(message.getBytes("UTF-8"), messageProperties));
        return "message sended : routingKey >" + routingKey + ";message > " + message;
    }

}

7、ConcumerReceiver

@Component
public class ConcumerReceiver {


    //直连模式的多个消费者,会分到其中一个消费者进行消费。类似task模式
    //通过注入RabbitContainerFactory对象,来设置一些属性,相当于task里的channel.basicQos
    @RabbitListener(queues = "helloWorldqueue")
    public void helloWorldReceive(String message) {

        System.out.println("helloWorld模式 received message : " + message);
    }

    //工作队列模式
    @RabbitListener(queues = "work_sb_mq_q")
    public void wordQueueReceiveq1(String message) {

        System.out.println("工作队列模式1 received message : " + message);
    }

    @RabbitListener(queues = "work_sb_mq_q")
    public void wordQueueReceiveq2(String message) {

        System.out.println("工作队列模式2 received message : " + message);
    }


    //pub/sub模式进行消息监听
    @RabbitListener(queues = "fanout.q1")
    public void fanoutReceiveq1(String message) {

        System.out.println("发布订阅模式1received message : " + message);
    }

    @RabbitListener(queues = "fanout.q2")
    public void fanoutReceiveq2(String message) {

        System.out.println("发布订阅模式2 received message : " + message);
    }


    //Routing路由模式
    @RabbitListener(queues = "direct_sb_mq_q1")
    public void routingReceiveq1(String message) {

        System.out.println("Routing路由模式routingReceiveq11111 received message : " + message);
    }

    @RabbitListener(queues = "direct_sb_mq_q2")
    public void routingReceiveq2(String message) {

        System.out.println("Routing路由模式routingReceiveq22222 received message : " + message);
    }


    //topic 模式
    //注意这个模式会有优先匹配原则。例如发送routingKey=hunan.IT,那匹配到hunan.*(hunan.IT,hunan.eco),之后就不会再去匹配*.ITd
    @RabbitListener(queues = "topic_sb_mq_q1")
    public void topicReceiveq1(String message) {
        System.out.println("Topic模式 topic_sb_mq_q1 received message : " + message);
    }

    @RabbitListener(queues = "topic_sb_mq_q2")
    public void topicReceiveq2(String message) {
        System.out.println("Topic模式 topic_sb_mq_q2 received  message : " + message);
    }

}

二、简单模式

队列配置:

/**
 * HelloWorld rabbitmq第一个工作模式
 * 直连模式只需要声明队列,所有消息都通过队列转发。
 * 无需设置交换机
 */
@Configuration
public class HelloWorldConfig {

	@Bean
	public Queue setQueue() {
		return new Queue("helloWorldqueue");
	}
}

三、工作队列模式

@Configuration
public class WorkConfig {

    //声明队列
    @Bean
    public Queue workQ1() {
        return new Queue("work_sb_mq_q");
    }
}

四、广播模式(Fanout)

/**
 * Fanout模式需要声明exchange,并绑定queue,由exchange负责转发到queue上。
 * 广播模式 交换机类型设置为:fanout
 */
@Configuration
public class FanoutConfig {

	//声明队列
	@Bean
	public Queue fanoutQ1() {
		return new Queue("fanout.q1");
	}
	@Bean
	public Queue fanoutQ2() {
		return new Queue("fanout.q2");
	}


	//声明exchange
	@Bean
	public FanoutExchange setFanoutExchange() {
		return new FanoutExchange("fanoutExchange");
	}


	//声明Binding,exchange与queue的绑定关系
	@Bean
	public Binding bindQ1() {
		return BindingBuilder.bind(fanoutQ1()).to(setFanoutExchange());
	}
	@Bean
	public Binding bindQ2() {
		return BindingBuilder.bind(fanoutQ2()).to(setFanoutExchange());
	}
}

五、直连模式(Direct)

/*
   路由模式|Routing模式   交换机类型:direct
*/
@Configuration
public class DirectConfig {

	//声明队列
	@Bean
	public Queue directQ1() {
		return new Queue("direct_sb_mq_q1");
	}
	@Bean
	public Queue directQ2() {
		return new Queue("direct_sb_mq_q2");
	}


	//声明exchange
	@Bean
	public DirectExchange setDirectExchange() {
		return new DirectExchange("directExchange");
	}

	//声明binding,需要声明一个routingKey
	@Bean
	public Binding bindDirectBind1() {
		return BindingBuilder.bind(directQ1()).to(setDirectExchange()).with("china.changsha");
	}
	@Bean
	public Binding bindDirectBind2() {
			return BindingBuilder.bind(directQ2()).to(setDirectExchange()).with("china.beijing");
	}

}

六、通配符模式(Topic)

/*
Topics模式  交换机类型 topic
* */
@Configuration
public class TopicConfig {

	//声明队列
	@Bean
	public Queue topicQ1() {
		return new Queue("topic_sb_mq_q1");
	}
	@Bean
	public Queue topicQ2() {
		return new Queue("topic_sb_mq_q2");
	}


	//声明exchange
	@Bean
	public TopicExchange setTopicExchange() {
		return new TopicExchange("topicExchange");
	}

	//声明binding,需要声明一个roytingKey
	@Bean
	public Binding bindTopicHebei1() {
		return BindingBuilder.bind(topicQ1()).to(setTopicExchange()).with("changsha.*");
	}
	@Bean
	public Binding bindTopicHebei2() {
		return BindingBuilder.bind(topicQ2()).to(setTopicExchange()).with("#.beijing");
	}
}

测试

我们启动上面的SpringBoot项目。

然后我们访问swagger地址:http://127.0.0.1:8080/swagger-ui.html

SpringBoot整合RabbitMQ的5种模式实战

然后我们就可以使用swagger测试接口了。

SpringBoot整合RabbitMQ的5种模式实战

SpringBoot整合RabbitMQ的5种模式实战

或者可以使用postman进行测试。

到此这篇关于SpringBoot整合RabbitMQ的5种模式实战的文章就介绍到这了,更多相关SpringBoot整合RabbitMQ模式内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
源码解读Spring-Integration执行过程
Jun 11 Java/Android
浅谈@Value和@Bean的执行顺序问题
Jun 16 Java/Android
详解Java分布式事务的 6 种解决方案
Jun 26 Java/Android
Spring Security使用单点登录的权限功能
Apr 03 Java/Android
Java 使用类型为Object的变量指向任意类型的对象
Apr 13 Java/Android
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
Apr 19 Java/Android
Elasticsearch 配置详解
Apr 19 Java/Android
JAVA 线程池(池化技术)的实现原理
Apr 28 Java/Android
Android存储中最基本的文件存储方式
Apr 30 Java/Android
Android Studio实现简易进制转换计算器
May 20 Java/Android
详解Flutter自定义应用程序内键盘的实现方法
Jun 14 Java/Android
Mybatis-plus配置分页插件返回统一结果集
Jun 21 Java/Android
Log4j.properties配置及其使用
Aug 02 #Java/Android
一篇文章带你学习Mybatis-Plus(新手入门)
Spring Boot 排除某个类加载注入IOC的操作
Aug 02 #Java/Android
SpringBoot+VUE实现数据表格的实战
springboot 启动如何排除某些bean的注入
Aug 02 #Java/Android
idea 在springboot中使用lombok插件的方法
Spring Boot mybatis-config 和 log4j 输出sql 日志的方式
Jul 26 #Java/Android
You might like
PHP关于htmlspecialchars、strip_tags、addslashes的解释
2014/07/04 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
2015/10/20 PHP
PHP sleep()函数, usleep()函数
2016/08/25 PHP
PHP使用pdo连接access数据库并循环显示数据操作示例
2018/06/05 PHP
js+css在交互上的应用
2010/07/18 Javascript
Javascript之旅 对象的原型链之由来
2010/08/25 Javascript
js 中的switch表达式使用示例
2020/06/03 Javascript
javascript框架设计之框架分类及主要功能
2015/06/23 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
2015/11/18 Javascript
jQuery Validate 数组 全部验证问题
2017/01/12 Javascript
学好js,这些js函数概念一定要知道【推荐】
2017/01/19 Javascript
微信小程序中实现手指缩放图片的示例代码
2018/03/13 Javascript
JS监听事件的叠加和移除功能
2018/11/19 Javascript
深入解析vue 源码目录及构建过程分析
2019/04/24 Javascript
vue 项目中当访问路由不存在的时候默认访问404页面操作
2020/08/31 Javascript
[38:41]2014 DOTA2国际邀请赛中国区预选赛 LGD VS CNB
2014/05/22 DOTA
Python中index()和seek()的用法(详解)
2017/04/27 Python
Python使用cx_Oracle模块操作Oracle数据库详解
2018/05/07 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
2018/11/29 Python
Python常用特殊方法实例总结
2019/03/22 Python
详解python调用cmd命令三种方法
2019/07/08 Python
python获取栅格点和面值的实现
2020/03/10 Python
Python3之外部文件调用Django程序操作model等文件实现方式
2020/04/07 Python
解决Python数据可视化中文部分显示方块问题
2020/05/16 Python
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
荷兰电脑专场:Paradigit
2018/05/05 全球购物
Jacadi Paris英国官网:法国童装品牌
2019/08/09 全球购物
电子商务专业实习生自我鉴定
2013/09/24 职场文书
简历的自我评价范文
2014/02/04 职场文书
庆元旦广播稿
2014/02/10 职场文书
2014大学生党员评议个人总结
2014/09/22 职场文书
党员民主生活会整改措施
2014/09/26 职场文书
卫校毕业生自我鉴定
2014/09/28 职场文书
电话营销开场白
2015/05/29 职场文书
英语演讲开场白
2015/05/29 职场文书
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
2021/04/22 PostgreSQL