RabbitMQ整个SpringBoot

SpringBoot因其配置简单、快速开发,已经成为热门的开发之一

消息中间件的工作过程可以用生产者消费者模型来表示.即,生产者不断的向消息队列发送信息

而消费者从消息队列中消费信息.具体过程如下:

从上图可看出,对于消息队列来说,生产者,消息队列,消费者是最重要的三个概念

生产者发消息到消息队列中去,消费者监听指定的消息队列,并且当消息队列收到消息之后,

接收消息队列传来的消息,并且给予相应的处理.消息队列常用于分布式系统之间互相信息的传递.

使用SpringBoot进行整合RabbitMQ

1.pom文件的引入

这是操作RabbitMQ的starter必须要进行引入的

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

2.配置文件进行基础的配置

spring.rabbitmq.virtual-host=/user
spring.rabbitmq.port=
spring.rabbitmq.password=user
spring.rabbitmq.username=user
spring.rabbitmq.host=192.168.43.157

RabbitMQ的模式

1、direct模式

配置Queue(消息队列).那注意由于采用的是Direct模式,需要在配置Queue的时候,指定一个键

使其和交换机绑定.

DirectQueue.java
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class DirectQueue {
   //若队列不存在则进行创建队列
   //返回的是队列名字
@Bean
public Queue queue(){
return new Queue("direct_queue");
}
}

消息生产者

Sender.java 
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; @Component
public class Sender { @Autowired
private AmqpTemplate amqpTemplate; public void send(){
String msg = "direct_queue";
User user = new User();
user.setName("MrChegns");
user.setAge();
amqpTemplate.convertAndSend("direct_queue",user);
} }

此时发送的消息是一个User类型的对象

对于发送对象需要实现序列化接口

User.java 
package com.cr.rabbitmqs.direct;
import java.io.Serializable;
public class User implements Serializable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public User(String name, int age) {this.name = name;
this.age = age;
}
public User() {
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

消费者

Receive.java 
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component; @Component
public class Receive {
   //对队列进行监听
   //同时可以监听多个队列
@RabbitListener(queues = "direct_queue")
public void listen(User msg){
System.out.println(msg);
}
}

测试:

 @Autowired
private Sender sender; @Test
public void test1(){
sender.send();
}

得到的结果i:

2、topic模式

首先我们看发送端,我们需要配置队列Queue,再配置交换机(Exchange)

再把队列按照相应的规则绑定到交换机上

Topic.java
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.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class Topic { //创建队列
@Bean(name = "message")
public Queue Aqueue(){
return new Queue("message.topic");
} @Bean(name = "message1")
public Queue BQueue(){
return new Queue("message.topics");
} //交换机
//若不存在则进行创建交换机
@Bean
public TopicExchange exchange(){
return new TopicExchange("topic_exchange");
} //交换机和队列进行绑定
@Bean
Binding bindingExchangeTopic(@Qualifier("message")Queue message,TopicExchange exchange){
return BindingBuilder.bind(message).to(exchange).with("message.topic"
);
}

@Bean
Binding bindingExchangeTopics(@Qualifier("message1")Queue message,TopicExchange exchange){
return BindingBuilder.bind(message).to(exchange).with("message.#");
}
}

消费者

Receive1.java 
import com.cr.rabbitmqs.direct.User;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component; @Component
public class Receive1 {

@RabbitListener(queues
= "message.topic")
public void tes(User user){
System.out.println( "user1111:" + user);
}
}
Receive2.java 
import com.cr.rabbitmqs.direct.User;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component; @Component
public class Receive2 { @RabbitListener(queues = "message.topics")
public void tes(User user){
System.out.println("user222:" + user);
}
}

消息生产者:

TopicSend.java 
import com.cr.rabbitmqs.direct.User;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; @Component
public class TopicSend {
@Autowired
private AmqpTemplate amqpTemplate; //发送消息
public void send(){
User user = new User("name",); amqpTemplate.convertSendAndReceive("topic_exchange","message.dev",user);
} //发送消息
public void send1(){
   User user = new User("name",12);
   amqpTemplate.convertSendAndReceive("topic_exchange","message.topic",user ); 
} 
}

在开发中这种模式的使用还是相对比较多的,此时测试的是两种方法

一个方法所有的队列都可以进行获取

一个方法只有一个队列可以获取到消息

测试:

    @Autowired
private TopicSend topicSend; @Test
public void ttt(){
topicSend.send();
}

测试:

    @Autowired
private TopicSend topicSend; @Test
public void ttt(){
topicSend.send1();
}

后台查看交换机和队列的绑定关系以机相关的路由键

3、fanout

那前面已经介绍过了,Fanout Exchange形式又叫广播形式,因此我们发送到路由器的消息会使

得绑定到该路由器的每一个Queue接收到消息,这个时候就算指定了Key,或者规则(即上文中

convertAndSend方法的参数2),也会被忽略!那么直接上代码,发送端配置如下:

Fanout.java

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 Fanout { //队列
//如果队列不存在会自动创建队列
@Bean
public Queue queueA(){
return new Queue("queueA");
} @Bean
public Queue queueB(){
return new Queue("queueB");
} @Bean
public Queue queueC(){
return new Queue("queueC");
} //交换机
//如果交换机不存在会自动创建队列
@Bean
public FanoutExchange fanoutExchange(){
return new FanoutExchange("fanoutExchange");
} //将交换机和队列进行绑定
@Bean
Binding bindingExchangequeueA(Queue queueA,FanoutExchange fanoutExchange){
return
BindingBuilder.bind(queueA).to(fanoutExchange);
}
@Bean
Binding bindingExchangequeueB(Queue queueB,FanoutExchange fanoutExchange){
return BindingBuilder.bind(queueB).to(fanoutExchange);
} @Bean
Binding bindingExchangequeueC(Queue queueC,FanoutExchange fanoutExchange){
return BindingBuilder.bind(queueC).to(fanoutExchange);
}
}

消费者:

FanoutReceive.java

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component; @Component
//监听器
@RabbitListener(queues = "queueA")
public class FanoutReceive { //监听的方法
@RabbitHandler
public void listen(String msg){
System.out.println("queueA" + msg);
} }

FanoutSender.java

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; @Component
public class FanoutSender { @Autowired
private AmqpTemplate amqpTemplate; //发送消息
public void send(){
String msg = "test fanout....";
//发送消息:参数依次是 交换机名字--路由键(此时设置路由键没有作用)--消息
amqpTemplate.convertAndSend("fanoutExchange",""
,msg);
}
}

测试:

@RunWith(SpringRunner.class)
@SpringBootTest
public class BpptandrabbitmqApplicationTests {
//测试fanout
@Autowired
private FanoutSender fanoutSender; @Test
public void fanout() {
fanoutSender.send();
} }

此时3个队列都能接收到消息

交换机、队列以及路由键

10-RabbitMQ-整合SpringBoot的更多相关文章

  1. 消息中间件——RabbitMQ(十)RabbitMQ整合SpringBoot实战!(全)

    前言 1. SpringBoot整合配置详解 publisher-confirms,实现一个监听器用于监听Broker端给我们返回的确认请求:RabbitTemplate.ConfirmCallbac ...

  2. RabbitMQ从概念到使用、从Docker安装到RabbitMQ整合Springboot【1.5w字保姆级教学】

    @ 目录 一.前言 二.RabbitMQ作用 1. 异步处理 2. 应用解耦 3. 流量控制 三.RabbitMQ概念 1. RabbitMQ简介 2. 核心概念 四.JMS与AMQP比较 五.Rab ...

  3. 02.RabbitMQ整合springboot简单使用

    1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  4. SpringBoot系列八:SpringBoot整合消息服务(SpringBoot 整合 ActiveMQ、SpringBoot 整合 RabbitMQ、SpringBoot 整合 Kafka)

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot 整合消息服务 2.具体内容 对于异步消息组件在实际的应用之中会有两类: · JMS:代表作就是 ...

  5. RabbitMQ和SpringBoot的简单整合列子

    一 思路总结 1 主要用spring-boot-starter-amqp来整合RabbitMQ和SpringBoot 2 使用spring-boot-starter-test来进行单元测试 3编写配置 ...

  6. RabbitMQ交换机、RabbitMQ整合springCloud

    目标 1.交换机 2.RabbitMQ整合springCloud 交换机 蓝色区域===生产者 红色区域===Server:又称Broker,接受客户端的连接,实现AMQP实体服务 绿色区域===消费 ...

  7. RabbitMQ 整合 SpringCloud实战

    RabbitMQ 整合 SpringCloud实战RabbitMQ 整合 SpringCloud实战rabbitmq-common 子项目rabbitmq-springcloud-consumer 子 ...

  8. SpringBoot2.0+Mybatis-Plus3.0+Druid1.1.10 一站式整合

    SpringBoot2.0+Mybatis-Plus3.0+Druid1.1.10 一站式整合 一.先快速创建一个springboot项目,其中pom.xml加入mybatis-plus 和druid ...

  9. 整合 springboot 和 swagger出问题

    整合 springboot 和 swagger ,出现报错, org.springframework.beans.factory.UnsatisfiedDependencyException: Err ...

  10. Activiti7整合SpringBoot(十二)

    1 SpringBoot 整合 Activiti7 的配置 为了能够实现 SpringBoot 与 Activiti7 整合开发,首先我们要引入相关的依赖支持.所以,我们在工程的 pom.xml 文件 ...

随机推荐

  1. 关于vue.js父子组件数据传递

    vue.js中使用props down,events up的原则进行父子组件间的通信,先来记录下props down,看个例子: <div id="app2"> < ...

  2. 获取java根目录,加载根目录下的文件

    就两句代码 String filepath = System.getProperty("user.dir")+"/a.xlsx"; File file=new ...

  3. JDBC增加、更新、删除数据

    JDBC增加.更新.删除数据 st.executeUpdate(sql) 进行插入.更新.删除操作返回的是受影响的记录的条数 注意:输入的sql语句中,vachar类型记住加单引号 完整代码如下: p ...

  4. csharp: read excel using Aspose.Cells

    /// <summary> /// /// </summary> /// <param name="strFileName"></para ...

  5. js事件队列

    前面跟网友讨论到了JS的事件队列 ,对这个有了一些理解,事件队列我认为就是把一些不按顺序执行的事件放到队列里面,然后按照自己制定的顺序去执行,那么什么情况下会用到这个呢?我首先想到的是动画,动画是会执 ...

  6. Maven学习总结(一):基本概念

    一.Maven的基本概念 Maven(翻译为"专家","内行")是跨平台的项目管理工具.主要服务于基于Java平台的项目构建,依赖管理和项目信息管理. 1.1. ...

  7. html5 转义实体字符 元数据 跳转 全局属性 id class lang style

    实体 Html 实体就是把特殊字符通过代码显示出来, 比如, <>在浏览器会识别为标签,不能正常显示, 这是你就需要安如<去表达左尖括号.     元数据 2. 声明字符编码 3.模 ...

  8. 从接口取到的JSON数据如何导入进本地SQL数据库

    新手学习,求大神指点. 首先:在数据库建立表--设计字段(最好和接口说明文档里面的一致) 第一步:获取接口中的字符串:这里获取的是有转义字符的字符串 HttpWebRequest request = ...

  9. 如何验证一份HTML文档的格式是否正确

    在浏览器中打开 Markup Validation Service . 点击或者激活 Validate by Direct Input 栏. 将整个示范文档的代码(不仅仅是body部分)复制粘贴到在M ...

  10. 新手嘛,先学习下 Vue2.0 新手入门 — 从环境搭建到发布

    Vue2.0 新手入门 — 从环境搭建到发布 转自:http://www.runoob.com/w3cnote/vue2-start-coding.html 具体文章详细就不搬了,步骤可过去看,我这就 ...