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. WPF中ScrollViewer嵌套引发滚动失灵的Bug

    事情起因 测试报告说存在滚动条不能拖动的情况,我们几个开发人员多次测试都未重现该问题.后面发现是操作系统的问题,在XP和部分Win7上会存在该问题.而在我们开发人员的机器上,包括Win7 SP1,Wi ...

  2. VMwear安装Centos7详细过程

      1.软硬件准备软件:推荐使用VMwear,我用的是VMwear 10镜像:CentOS7   硬件:因为是在宿主机上运行虚拟化软件安装centos,I3CPU双核.硬盘500G.内存4G以上. 2 ...

  3. POJ 2184(01背包)(负体积)

    http://poj.org/problem?id=2184 http://blog.csdn.net/liuqiyao_01/article/details/8753686 对于负体积问题,可以先定 ...

  4. HDU 2680(最短路)(多个起始点)

    这道题也是死命TLE.. http://acm.hdu.edu.cn/showproblem.php?pid=2680 /* 使用pair代替结构 */ #include <iostream&g ...

  5. 第三天-基本数据类型 int bool str

    # python基础数据类型 # 1. int 整数 # 2.str 字符串.不会用字符串保存大量的数据 # 3.bool 布尔值. True, False # 4.list 列表(重点) 存放大量的 ...

  6. 51Nod 算法马拉松23 开黑记

    惨啊……虽然开了半天黑,但是还是被dalao们踩了…… 第二次开黑,还是被卡在rank20了,我好菜啊……= = 写一写比赛经过吧…… 看到题之后习惯性都打开,A~D看上去似乎并没有什么思路,F应该是 ...

  7. 如何面试Web前端开发

    分享一篇HR前端面试心得: 面试前端工程师对我来说是一件非常有意思的事,因为面试过程很大程度上也是自我提升的过程.无论大公司还是小公司,之所以在如何招聘到真正有能力的,前端工程师方面会遇到同样的问题. ...

  8. Spring mvc与Struts2的比较

    1. 机制:spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同. 2. 性能:spring会稍微比struts快.spring mvc是基于方法的设 ...

  9. 软工读书笔记 week 5 ——《构建之法》

    本周主要对<构建之法>中的一部分进行阅读. 一.软件与软件工程究竟是什么? 本书的概论部分就指出“软件 = 程序 + 软件工程”.而我们这门课的名字就叫“现代软件工程”.其实在上课之前,我 ...

  10. json 对象里面含有 =的解决办法

    今天通过restful 调用接口的时候,遇到这样的问题,通过接口返回的数据如下: { "code": 0, "message": "成功", ...